android https 简书,关于Android http改为https
幸虧通過一個朋友找到了以下這個簡便的開源庫
然后用里面的SSLUtil,10分鐘就解決了。
實(shí)現(xiàn)自簽名SSL證書
1.訪問以上開源庫網(wǎng)址下載SSLUtil
2.把服務(wù)器生成的自簽名證書cer文件放到在assets目錄下,這里以demo.cer做示范
3.初始化SSLSocketFactory
在http請求類的constructor中添加以下代碼,這里以HttpRequest做示范
socketFactory = SSLUtil.getSSLSocketFactory(context.getAssets().open("demo.cer"));
4.添加信任https證書
在new OKHttpClient后添加以下代碼
if (url.startsWith("https://") && socketFactory != null) {
client.setSslSocketFactory(socketFactory);
}
以上這幾步就是全部步驟了,如果你還是覺得麻煩,推薦使用Android-ZBLibray這個Android快速開發(fā)框架,里面自簽名已全部封裝好,只需替換下demo.cer文件即可。
Android快速開發(fā)框架-ZBLibrary 源碼下載地址如下:
importjava.io.IOException;
importjava.io.InputStream;
importjava.security.KeyStore;
importjava.security.KeyStoreException;
importjava.security.NoSuchAlgorithmException;
importjava.security.SecureRandom;
importjava.security.UnrecoverableKeyException;
importjava.security.cert.CertificateException;
importjava.security.cert.CertificateFactory;
importjavax.net.ssl.KeyManager;
importjavax.net.ssl.KeyManagerFactory;
importjavax.net.ssl.SSLContext;
importjavax.net.ssl.SSLSocketFactory;
importjavax.net.ssl.TrustManagerFactory;
/**
* Https 證書工具類
* User:lizhangqu(513163535@qq.com)
* Date:2015-09-02
* Time: 12:52
*/
publicclassSSLUtil{
//使用命令keytool -printcert -rfc -file srca.cer 導(dǎo)出證書為字符串,然后將字符串轉(zhuǎn)換為輸入流,如果使用的是okhttp可以直接使用new Buffer().writeUtf8(s).inputStream()
/**
* 返回SSLSocketFactory
*
* @param certificates 證書的輸入流
* @return SSLSocketFactory
*/
publicstaticSSLSocketFactorygetSSLSocketFactory(InputStream...certificates) {
returngetSSLSocketFactory(null,certificates);
}
/**
* 雙向認(rèn)證
* @param keyManagers KeyManager[]
* @param certificates 證書的輸入流
* @return SSLSocketFactory
*/
publicstaticSSLSocketFactorygetSSLSocketFactory(KeyManager[]keyManagers,InputStream...certificates) {
try{
CertificateFactorycertificateFactory=CertificateFactory.getInstance("X.509");
KeyStorekeyStore=KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null);
intindex=0;
for(InputStreamcertificate:certificates) {
StringcertificateAlias=Integer.toString(index++);
keyStore.setCertificateEntry(certificateAlias, certificateFactory.generateCertificate(certificate));
try{
if(certificate!=null)
certificate.close();
}catch(IOExceptione) {
}
}
SSLContextsslContext=SSLContext.getInstance("TLS");
TrustManagerFactorytrustManagerFactory=TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keyStore);
sslContext.init(keyManagers, trustManagerFactory.getTrustManagers(),newSecureRandom());
SSLSocketFactorysocketFactory=sslContext.getSocketFactory();
returnsocketFactory;
}catch(Exceptione) {
e.printStackTrace();
}
returnnull;
}
/**
* 獲得雙向認(rèn)證所需的參數(shù)
* @param bks bks證書的輸入流
* @param keystorePass 秘鑰
* @return KeyManager[]對象
*/
publicstaticKeyManager[]getKeyManagers(InputStreambks,StringkeystorePass) {
KeyStoreclientKeyStore=null;
try{
clientKeyStore=KeyStore.getInstance("BKS");
clientKeyStore.load(bks, keystorePass.toCharArray());
KeyManagerFactorykeyManagerFactory=KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(clientKeyStore, keystorePass.toCharArray());
KeyManager[] keyManagers=keyManagerFactory.getKeyManagers();
returnkeyManagers;
}catch(KeyStoreExceptione) {
e.printStackTrace();
}catch(UnrecoverableKeyExceptione) {
e.printStackTrace();
}catch(CertificateExceptione) {
e.printStackTrace();
}catch(NoSuchAlgorithmExceptione) {
e.printStackTrace();
}catch(IOExceptione) {
e.printStackTrace();
}
returnnull;
}
}
總結(jié)
以上是生活随笔為你收集整理的android https 简书,关于Android http改为https的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 图片缩放算法,Andro
- 下一篇: pitch android,Pitch