我开发了一个需要与服务器进行安全通信的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);
我在应用程序启动时使用上面的代码,即使证书已经存在,它也会提示。关于这一点,我有两个问题,
以编程方式如何识别特定证书是否已存在?所以我只在它不存在时才会提示。
在应用程序安装过程中是否有任何事件,我应该用它来提示用户安装证书?
答案 0 :(得分: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());
}
答案 1 :(得分:0)
由于似乎it is not possible以编程方式检索已安装证书的列表,因此您无法说明您的证书何时已安装。如果你得到关于不受信任的服务器的例外,你应该安装它。
在应用程序安装期间也没有事件发生(也应该捕获此类事件?)