2014-02-08 22 views
1

我需要獲得不可否認和數字簽名證書。我已經實現了這個代碼來獲得這些證書:如何爲PKI客戶端獲取非拒絕和數字簽名證書

keyStore.load(null, null); 
Enumeration<String> aliases = keyStore.aliases(); 
while (aliases.hasMoreElements()) { 
    String alias = aliases.nextElement(); 
     if (keyStore.isKeyEntry(alias)) { 
      java.security.cert.Certificate certificate = keyStore.getCertificate(alias); 
     } 
} 

問題是,數字和不可抵賴性證書具有相同的別名。所以當我打電話給keystore.getCertificate時,系統總是會返回第一個結果,儘管在certmgr.msc窗口中我可以看到有兩個證書存在,而LOOP塊執行兩次,但系統總是會從第一個證書返回重複結果。我如何解決這個問題?

回答

2

您不能真正擁有兩個具有相同別名的不同條目。但是,這是如何從密鑰庫獲得所有第一級證書的列表,列表

List<Certificate> certificates = new ArrayList<Certificate>(); 
Enumeration<String> aliases = keyStore.aliases(); 
while (aliases.hasMoreElements()) { 
    String alias = aliases.nextElement(); 
    Certificate certificate = keyStore.getCertificate(alias); 
    if (certificate != null) { 
     certificates.add(certificate); 
    } 
} 
+0

我絕對不會問如何區分不可否認性和數字簽名的問題。我問的是提取證書的過程,因此,請您提出一種加載兩個證書的方法,因爲我現在正在執行的方式會檢測兩個證書,但在每次迭代中加載相同的對象 – user435245

+0

已經更新了我的答案,所以現在列表將包含密鑰存儲所擁有的所有證書。 – divanov

+0

這是正確的想法,但不幸的是,由於Windows存儲中的實現細節(bug?),這不會列出商店中的所有證書...... – Bruno

1

既然你在談論certmgr.msc和使用keyStore.load(null, null),我相信你正在使用的WINDOWS-ROOTWINDOWS-MY密鑰庫,來自SunMSCAPI provider

不幸的是,有一個issue with this provider,因爲它可以重複使用多個條目相同的別名,從而使訪問某些證書很困難或不可能。

此密鑰庫使用的別名實際上是證書的「友好名稱」(在MS-CAPI術語中)。儘管Windows證書存儲區中的友好名稱不必是唯一的,但別名的名稱必須是。

大概是因爲你似乎在談論同一實體的兩個不同的證書,但具有不同的目的,他們很可能默認使用相同的友好名稱。

解決此問題的一種方法是在Windows應用商店中用不同的友好名稱標識您的證書:在certmgr.msc中,選擇證書,右鍵單擊,選擇「屬性」並更改其「友好名稱」。

如果您有兩個具有唯一友好名稱的不同證書(用於不同的密鑰用途或任何其他原因),那麼它們應該在您的KeyStore中顯示不同的別名。