我对如何在OkHttp中使用系统信任的凭据感到有些困惑。我正在使用以下代码:
SSLContext sslContext = SSLContext.getInstance("TLS");
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
String algo = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf =TrustManagerFactory.getInstance(algo);
tmf.init(ks);
TrustManager managers[]= tmf.getTrustManagers();
X509TrustManager defaultTrustMgr = null;
for (int i = 0; i < managers.length; i++) {
if (managers[i] instanceof X509TrustManager) {
defaultTrustMgr = (X509TrustManager) managers[i];
}
}
X509Certificate[] x509Certificates = defaultTrustMgr.getAcceptedIssuers();
sslContext.init(null, managers, null);
但是,当我使用查尔斯时,我仍然可以嗅探流量,因此可以在中间攻击中使用一个人。如何配置OkHttp以使用Android随附的默认证书?
谢谢,格雷姆
最佳答案
您需要显式配置OkHttp的套接字工厂:
okHttpClient.setSslSocketFactory(sslContext.getSocketFactory());
以前OkHttp使用系统默认的套接字工厂,但这是有问题的。特别是,将该套接字工厂配置为支持SPDY和HTTP / 2的NPN和ALPN会导致共享该套接字工厂的其他代码崩溃。