android - 为什么安装的 CA 未列在 Android 上的受信任凭据中
问题描述
我正在开发一个与服务器通信的 Android 应用程序(5.1 -> 此设备仅支持此版本),为此我使用 Retrofit。我有我的 CA,我需要将它与我的请求一起发送到服务器。
但我有两个问题:
1. 我把我的 cert.p12 放到我设备上的下载文件夹中。然后我安装了它:安全性->从 SD 卡安装。我收到了 CA 已安装的消息,但它未列在受信任的凭据 -> USER 中。
我使用此代码列出应用程序中所有已安装的 CA:
try
{
KeyStore ks = KeyStore.getInstance("AndroidCAStore");
if (ks != null)
{
ks.load(null, null);
Enumeration aliases = ks.aliases();
while (aliases.hasMoreElements())
{
String alias = (String) aliases.nextElement();
java.security.cert.X509Certificate cert = (java.security.cert.X509Certificate) ks.getCertificate(alias);
Log.e(TAG, cert.getIssuerDN().getName());
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (KeyStoreException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (java.security.cert.CertificateException e) {
e.printStackTrace();
}
我的证书也不在那个名单上。
任何建议为什么会这样?
- 当我设法安装证书并且它将按上面的代码列出时,只需执行下面的代码来验证服务器端的客户端就足够了吗?:
try {
String keyStoreType = KeyStore.getDefaultType();
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
if(keyStore != null){
keyStore.load(null, null);
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);
sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, tmf.getTrustManagers(), null);
client = new OkHttpClient.Builder()
.sslSocketFactory(sslContext.getSocketFactory())
.build();
}
} catch (KeyStoreException | CertificateException | NoSuchAlgorithmException | IOException | KeyManagementException e) {
e.printStackTrace();
}
此致!
解决方案
推荐阅读
- javascript - 为什么我的 Promise.all().then() 在所述 Promise.all() 中的承诺之前执行
- php - 运行 PHP 7.1 时如何修复致命错误
- sql - 计算表中所有列中的空值和非空值
- php - 在 Laravel 中获取当前语言
- null - qliksense 表达式中的空条件
- php - 尝试使用 htaccess 删除 .php 扩展名
- c - 循环查找 C 中数组中的最后一个偶数
- laravel - 如何在 Laravel 中将用户输出数据的第一个单词大写?
- reactjs - 网络连接检查反应
- dialogflow-es - Dialogflow Intent 在从 Google Assistant 的列表视图键中单击时不匹配,但在以纯文本形式编写时有效