我对如何在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会导致共享该套接字工厂的其他代码崩溃。

10-08 06:01