我有这种情况,我的应用程序需要向安全服务器发出请求(NON http(s),实际上它是关于SIP协议但问题应该适用于任何非http(s)协议),我需要能够根据我的Android设备密钥库中安装的系统默认值受信任证书来判断服务器是否被视为可信任。
问题是,在检查Android提供的所有API证书(如KeyStore,KeyChain等)后,我找不到解决方案。
似乎每个应用程序,即使它可以访问设备的System Default密钥库,它也只能访问它自己的资源,而不是全局资源,即使我们正在讨论TrustedCertificateEntry类型的条目。
这里有什么我想念的吗?
似乎非常有效的非https身份验证用例
祝你好运, 安东尼
答案 0 :(得分:3)
最后,设法找到了这样做的方法,所以让我分享一下这对其他人有用。结果证明,Android可以访问系统范围内的可信证书。这里的详细信息(以及它以前对我没有用的原因)是密钥库'类型'我使用的标识符:
KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
我相信我试图找到实际的密钥,当然不应该分享。所以经过一番挖掘,我发现有一个单独的类型,AndroidCAStore,它为我做了诀窍。所以这是一个工作代码摘录,只打印出证书:
try {
KeyStore ks = KeyStore.getInstance("AndroidCAStore");
ks.load(null);
try {
Enumeration<String> aliases = ks.aliases();
while (aliases.hasMoreElements()) {
Certificate cert = ks.getCertificate(aliases.nextElement());
Log.e(TAG, "Certificate: " + cert.toString());
}
}
catch(Exception e) {
e.printStackTrace();
}
}
catch (IOException|NoSuchAlgorithmException|KeyStoreException|CertificateException e) {
e.printStackTrace();
}