Android下OkHttp請求自定義HTTPS證書介面設定
阿新 • • 發佈:2019-01-01
在請求安全性高的介面時,我們可能會使用到HTTPS介面,HTTPS可以理解為HTTP+TLS,關於HTTPS具體是怎麼工作的,可以看這篇文章:http://gold.xitu.io/entry/56ef4ff47db2a20052218e0f
如果你的證書是向Android中內建預設信任的證書頒發機構申請的,則不需要通過此步驟(需要好多錢,但是大部分國內應用不會花那麼多錢去買權威機構頒發的證書),如果不是,此步驟是在你的App網路請求中加入信任自定義的證書(第三方非權威證書頒發機構頒發的證書),讓你的App信任此第三方非權威證書頒發機構。
try {
//取得SSL的SSLContext例項,使用TLS協議
SSLContext sslContext = SSLContext.getInstance ("TLS");
//取得KeyManagerFactory和TrustManagerFactory的X509金鑰管理器例項
KeyManagerFactory keyManager = KeyManagerFactory.getInstance("X509");
TrustManagerFactory trustManager = TrustManagerFactory.getInstance("X509");
//取得BKS密庫例項
KeyStore kks = KeyStore.getInstance("PKCS12");
//Android支援BKS的KeyStore
KeyStore tks = KeyStore.getInstance ("BKS");
//加客戶端載證書和私鑰,通過讀取資原始檔的方式讀取金鑰和信任證書
//raw中為truststore.bks的信任密庫
tks.load(appCtx
.getResources()
.openRawResource(R.raw.truststore), CLIENT_TRUST_PASSWORD.toCharArray());
//raw資源中的檔案為client.p12格式的證書
kks.load(appCtx
.getResources()
.openRawResource (R.raw.client), CLIENT_KET_PASSWORD.toCharArray());
//初始化金鑰管理器
keyManager.init(kks, CLIENT_KET_PASSWORD.toCharArray());
trustManager.init(tks);
//初始化SSLContext
sslContext.init(keyManager.getKeyManagers(),
trustManager.getTrustManagers(), null);
mOkHttpClient = OkHttpUtils.getInstance().getOkHttpClient();
mOkHttpClient.setSslSocketFactory(sslContext.getSocketFactory());
} catch (Exception e) {
Log.e(TAG, "init https proxy failed!");
throw new RuntimeException("init https proxy failed!");
}