繁体   English   中英

Android ICS - 仅在CA证书安装提示尚不存在时显示

[英]Android ICS - Show the CA certificate installation prompt only if it is not already present

我开发了一个需要与服务器进行安全通信的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. 是否在应用程序安装期间发生任何事件,我应该使用它来提示用户安装证书?

您可以使用这样的内容来枚举受信任的证书。 如果别名以'user'开头,则用户安装。 这不是公共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());
}

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

在应用程序安装期间也没有事件发生(也应该抓住这样的事件?)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM