既然在Android上不推荐使用SSLSocketFactory,那么处理客户端证书身份验证的最佳方法是什么?

时间:2015-06-23 11:57:47

标签: android ssl okhttp pkcs#12 sslsocketfactory

我正在开发一款需要客户端证书身份验证(包含PKCS 12文件)的Android应用。 在所有人apache.http.*被弃用之后,我们已经开始在我们的网络层上进行重构,我们决定选择OkHttp作为替代品,到目前为止我非常喜欢

但是,我还没有找到任何其他方法来处理客户端证书身份验证而不使用SSLSocketFactory,OkHttp或其他任何事情。那么在这种特殊情况下,最好的做法是什么? OkHttp是否有另一种方法来处理这种身份验证?

3 个答案:

答案 0 :(得分:31)

如果您使用的是https,则必须使用有效的证书。在您的开发阶段,您必须信任证书,如何? 不推荐使用sslSocketFactory(SSLSocketFactory sslSocketFactory)并将其替换为sslSocketFactory(SSLSocketFactory sslSocketFactory, X509TrustManager trustManager),您必须更新您的gradle文件 下面的代码将帮助您获得一个信任任何ssl证书的受信任的OkHttpClient。

TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init((KeyStore) null);
TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {
    throw new IllegalStateException("Unexpected default trust managers:" + Arrays.toString(trustManagers));
}
X509TrustManager trustManager = (X509TrustManager) trustManagers[0];
SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, new TrustManager[] { trustManager }, null);
SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
OkHttpClient client = new OkHttpClient.Builder().sslSocketFactory(sslSocketFactory, trustManager);

答案 1 :(得分:15)

显然,有两个SSLSocketFactory类。 HttpClient有自己的一个,并且与HttpClient的其余部分一起被弃用。但是,其他所有人都将使用the more conventional javax.net.ssl edition of SSLSocketFactory,但不会弃用(感谢$DEITY)。

答案 2 :(得分:0)

看这个,我找到了一些解决方案,并且在我这方面做得很好。检查我的整合方式。

OkHttpClient.Builder客户端=新的OkHttpClient.Builder();

在此处添加客户端实例的所有属性

。 。

并为sslSocketFactory添加以下代码行:

 try {
        // Create a trust manager that does not validate certificate chains
        final TrustManager[] trustAllCerts = new TrustManager[]{
                new X509TrustManager() {
                    @Override
                    public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) {
                    }

                    @Override
                    public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) {
                    }

                    @Override
                    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                        return new java.security.cert.X509Certificate[]{};
                    }
                }
        };

        // Install the all-trusting trust manager
        final SSLContext sslContext = SSLContext.getInstance("SSL");
        sslContext.init(null, trustAllCerts, new java.security.SecureRandom());

        // Create an ssl socket factory with our all-trusting manager
        final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

        client.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0]);
        client.hostnameVerifier((hostname, session) -> true);
    } catch (Exception e) {
        throw new RuntimeException(e);
  }