0

我开发了一个需要与服务器进行安全通信的 android 应用程序。我收到关于不受信任服务器的异常,因为我的服务器证书不是 android 证书列表的一部分。

我使用以下 KeyChain API(从 ICS 开始提供)来提示用户安装证书,之后可以无缝地进行通信。

        BufferedInputStream bis = new BufferedInputStream(getAssets().open(
                PKCS12_FILENAME));
        byte[] keychain = new byte[bis.available()];
        bis.read(keychain);

        Intent installIntent = KeyChain.createInstallIntent();
        installIntent.putExtra(KeyChain.EXTRA_PKCS12, keychain);
        installIntent.putExtra(KeyChain.EXTRA_NAME, DEFAULT_ALIAS);
        startActivityForResult(installIntent, INSTALL_KEYCHAIN_CODE);

我在应用程序启动时使用上面的代码,即使证书已经存在,它也会提示。关于这一点,我有以下两个问题,

  1. 如何以编程方式识别特定证书是否已经存在?这样我只在它不存在时才提示。

  2. 在应用程序安装过程中是否发生了任何事件,我应该使用它来提示用户安装证书?

4

2 回答 2

2

您可以使用类似的方法来枚举受信任的证书。如果别名以“用户”开头,则它是用户安装的。不过,这不是公共 API 的一部分,因此它可能会在未来的版本中中断。更多细节在这里: http: //nelenkov.blogspot.com/2011/12/ics-trust-store-implementation.html

KeyStore ks = KeyStore.getInstance("AndroidCAStore");
ks.load(null, null);
Enumeration aliases = ks.aliases();
while (aliases.hasMoreElements()) {
    String alias = aliases.nextElement();
    X09Certificate cert = (X509Certificate) 
       ks.getCertificate(alias);
    Log.d(TAG, "Subject DN: " + 
       cert.getSubjectDN().getName());
    Log.d(TAG, "Issuer DN: " + 
       cert.getIssuerDN().getName());
}
于 2013-02-18T01:53:26.010 回答
0

由于似乎无法以编程方式检索已安装证书的列表,因此您不能说您的证书何时已安装。恕我直言,如果您遇到有关不受信任的服务器的异常,您应该安装它。

在应用程序安装期间也没有发生事件(谁应该捕捉到这样的事件?)

于 2013-02-17T18:47:35.810 回答