2013-02-17 67 views
0

我开发了一个需要与服务器进行安全通信的android应用程序。我得到关于不受信任的服务器的例外,因为我的服务器证书不是Android的证书列表的一部分。Android ICS - 仅当CA证书安装提示不存在时才显示CA证书安装提示

我利用以下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. 在应用程序安装过程中是否发生了任何事件,我应该使用它来提示用户进行证书安装?

+0

在几天前有一个类似的问题,不知道它是否被回答。是否可以简单*尝试*通信并拦截缺少证书的安全例外情况? – 323go 2013-02-17 18:46:50

回答

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()); 
} 
+0

谢谢你的回答。它为我工作:) – 2013-02-19 04:16:52

0

因为似乎it is not possible检索已安装证书的列表程序,在已经安装了您的证书,你不能说。恕我直言,你应该安装它,如果你得到关于不受信任的服务器的异常。

还没有一个事件的应用程序安装过程中occouring(也谁应该抓住这样的事件?)

+0

感谢您的回答。有了事件,我的意思是有任何生命周期方法,我应该重写这些决定。 – 2013-02-18 04:34:20

+0

假设我只在遇到异常时才安装证书,那么我们是否有办法从异常中知道应该安装哪个证书? – 2013-02-19 08:49:20

+0

如果您想拦截安装过程,您正在安装的应用程序无法接收信号。 – gipi 2013-02-19 09:41:35