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

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

但是,我没有find任何其他方法来处理客户端证书auth而不使用SSLSocketFactory ,OkHttp或其他任何事情。 那么在这种特殊情况下,最好的行动方案是什么呢? OkHttp还有另一种方法来处理这种身份validation吗?

显然,有两个SSLSocketFactory类。 HttpClient有自己的一个,并且与HttpClient的其余部分一起被弃用。 但是,其他人都将使用SSLSocketFactory更传统的javax.net.ssl版本 ,该版本未被弃用(感谢$DEITY )。

如果您使用的是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);