【发布时间】:2017-03-05 22:55:23
【问题描述】:
我的 android 应用程序连接到 用户提供的 URL。在 HTTPS 连接的情况下,如果服务器的证书是由 Android 的 TrustManager 中已经存在的 CA 颁发的,那么一切都很好。
但如果服务器使用自签名证书,我如何在第一次连接时获取该证书并将其存储在 TrustManager 中?
我正在使用OkHttp 库来执行网络任务。我目前的解决方案迫使我在开发过程中将证书添加到应用程序的raw 文件夹中,但这不适用于上述场景。我目前使用的代码如下:
private KeyStore readKeyStore() throws KeyStoreException, CertificateException, NoSuchAlgorithmException, IOException {
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
String password = "testPass";
InputStream is = null;
try {
is = activity.getApplicationContext().getResources().openRawResource(R.raw.server_key);
ks.load(is, password.toCharArray());
} finally {
if (is != null)
is.close();
}
return ks;
}
private OkHttpClient getOkHttpClient() throws CertificateException, IOException, KeyManagementException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyStoreException {
SSLContext sslContext = SSLContext.getInstance("SSL");
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(readKeyStore());
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(readKeyStore(), "testPass".toCharArray());
sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), new SecureRandom());
return new OkHttpClient().setSslSocketFactory(sslContext.getSocketFactory());
}
【问题讨论】: