1

我有这种情况,我的应用程序需要向安全服务器发出请求(非 http(s),实际上它是关于 SIP 协议,但问题应该适用于任何非 http(s) 协议),我需要能够告诉如果服务器被认为是受信任的,则基于我的 Android 设备密钥库中安装的系统默认受信任证书。

问题是,在检查了 Android 为证书提供的所有 API(如 KeyStore、KeyChain 等)之后,我还没有找到解决方案。

似乎每个应用程序,即使它可以访问设备的系统默认密钥库,它也只能访问它自己的资源,而不是全局资源,即使我们谈论的是 TrustedCertificateEntry 类型的条目。

我在这里有什么遗漏吗?

似乎是非 https 身份验证的一个非常有效的用例

最好的问候,安东尼斯

4

1 回答 1

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();
}
于 2016-06-28T07:27:57.070 回答