2013-02-17 69 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