现在在Android上SSLSocketFactory已经被弃用,处理客户端证书认证的最佳方式是什么?

28
我正在开发一个需要客户端证书认证(使用PKCS 12文件)的Android应用程序。 随着所有"apache.http.*"的弃用,我们已经开始对网络层进行大规模的重构,并决定使用OkHttp作为替代方案,到目前为止,我很喜欢它。
然而,我没有找到任何其他处理客户端证书认证的方式,除了使用SSLSocketFactory,无论是在OkHttp还是其他任何地方。那么,在这种情况下,最好的做法是什么? 是否有另一种使用OkHttp处理此类身份验证的方法?

4
SSLSocketFactory 在当前 Android 版本以及 M Developer 预览版中均未被弃用。您可以在Android 开发者网站上查看相关信息。 - CommonsWare
1
哦,我的天啊,你说得完全正确,我从来没有意识到有两个类SSLSocketFactory!org.apache.http.conn.ssl.SSLSocketFactory已经被弃用了,但javax.net.ssl.SSLSocketFactory没有!非常感谢你的启示。 - TheYann
1
相反地,我没有意识到HttpClient有他们自己的SSLSocketFactory类。 :-) - CommonsWare
2个回答

54
如果您正在使用 HTTPS,则必须使用有效的证书。在开发阶段,您必须信任证书,如何做到呢?sslSocketFactory(SSLSocketFactory sslSocketFactory)已经被弃用,并被sslSocketFactory(SSLSocketFactory sslSocketFactory,X509TrustManager trustManager)所取代,您需要更新您的 gradle 文件。下面的代码片段将帮助您获取一个可信的 OkHttpClient,它信任任何 SSL 证书。
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);

3
谢谢,通过添加信任管理器可以简单地移除废弃警告。 - tryp
1
我仍然收到 SSLHandshakeException: connection closed by peer - IgorGanapolsky
我不是NTLM的专家,但你可能需要使用一个外部库,比如JCIFS。 - user2167877
代码中没有证书的引用。 - Raj Kanchan

19

显然,有两个SSLSocketFactory类。 HttpClient有它自己的类,而这个类与HttpClient的其余部分一样被弃用了。 但是,其他人将使用更常规的javax.net.ssl版本的SSLSocketFactory,这并没有被弃用(感谢$DEITY)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接