既然SSLSocketFactory在Android上已被弃用,那么处理客户端证书authentication的最好方法是什么呢?

我正在开发一个需要客户端证书authentication(带有PKCS 12文件)的Android应用程序。 在弃用所有apache.http.* ,我们开始在networking层重构一个相当大的工作,我们决定用OkHttp作为替代品,到目前为止,我非常喜欢这一点。

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

显然,有两个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);