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

The*_*ann 17 ssl android pkcs#12 sslsocketfactory okhttp

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

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

use*_*877 35

如果您使用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);
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,只需添加信任管理器即可删除已弃用的警告. (3认同)

Com*_*are 15

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