我正在开发一个需要客户端证书身份验证的Android应用程序(使用PKCS 12文件)。在所有apache.http.*
被弃用之后,我们已经开始了一项相当大的网络层重构工作,我们决定使用OkHttp作为替代,到目前为止,我非常喜欢这一点。
然而,我还没有找到任何其他方法来处理客户端证书身份验证,而不使用SSLSocketFactory
、OkHttp或其他任何方法。那么,在这种特殊情况下,最好的行动方案是什么呢?OkHttp还有其他方法可以处理这种身份验证吗?
如果使用https,则必须使用有效的证书。在您的开发阶段,您必须信任证书,如何信任?sslSocketFactory(SSLSocketFactory sslSocketFactory)
已弃用,它已被sslSocketFactory(SSLSocketFactory sslSocketFactory, X509TrustManager trustManager)
取代,您必须更新渐变文件下面的代码将帮助您获得一个信任任何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);
显然,有两个SSLSocketFactory
类。HttpClient有自己的一个,与HttpClient的其余部分一起被弃用。但是,其他所有人都将使用SSLSocketFactory
的更传统的javax.net.ssl
版本,该版本并未被弃用(感谢$DEITY
)。