gpt4 book ai didi

Android - 获取自签名服务器证书并添加到受信任的 keystore

转载 作者:太空狗 更新时间:2023-10-29 16:30:30 25 4
gpt4 key购买 nike

我的 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());
}

最佳答案

简单的解决方案

Here's a code example信任经理回调。从回调中,您可以存储自签名证书或立即接受它们。 但你不应该这样做。通过接受自签名证书,您可能会连接到假冒或恶意服务器,这些服务器可能会窃取个人数据、安装恶意软件并执行其他令人讨厌的事情。

比简单更好的解决方案

如果服务器提供您(开发人员)在编译时信任的自签名证书,您可以像您已经在做的那样将证书 bundle 到应用程序中。如果服务器有一个 CA 签名的证书会好得多,但如果你真的需要连接到一个提供自签名证书的服务器,这将(必须)这样做。

更好的解决方案

从不在运行时接受自签名证书。如果您想允许您的用户连接到这些类型的服务器,您可以在接受自签名证书之前显示一条警告消息,如“继续操作,风险自负”。

关于Android - 获取自签名服务器证书并添加到受信任的 keystore ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40213748/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com