2011-12-29 14 views
0

在使用 Client certificates for authentication的過程中,我決定使用 not-yet-commons-ssl-0.3.11.jar。這導致了另一個問題 - 在EasySSLProtocolSocketFactoryStrictSSLProtocolSocketFactory上調用構造函數的簡單行爲將產生一個異常。KeyStoreException:沒有在密鑰庫中發現的私鑰,但尚未公用-ssl-0.3.11.jar

的代碼,如簡單的CMD行應用程序隔離:

public class CertTest { 

public static void main(String[] args) { 

    System.setProperty("javax.net.debug", "ssl,handshake"); // SSL DEBUG INFO 
    String keystore = "/usr/java/jdk1.6.0_11/jre/lib/security/cacerts"; 
    String keystorePassword = "changeit"; 

System.setProperty("javax.net.ssl.keyStore", keystore); 
System.setProperty("javax.net.ssl.keyStorePassword", keystorePassword); 
//  System.setProperty("javax.net.ssl.trustStore", keystore); 
//  System.setProperty("javax.net.ssl.trustStorePassword", keystorePassword); 

    try { 
     org.apache.commons.httpclient.contrib.ssl.EasySSLProtocolSocketFactory factory = 
      new  org.apache.commons.httpclient.contrib.ssl.EasySSLProtocolSocketFactory(); 
    } 
    catch (Exception e) { 
     System.out.println (e); 
    } 

} }

要與舊庫隔離的問題,我把上面的代碼與這些罐子的目錄(這些在類路徑中的唯一罐子):

  1. 的HttpClient-4.0.1.jar
  2. 還未公共-SSL-0.3.11.jar
  3. 公地httpclient的-3.1.jar
  4. 的HttpCore-4.0.1.jar

因此,隨着cacerts密鑰庫的一些客戶端證書,我得到: org.apache.commons.ssl.ProbablyBadPasswordException: Probably bad JKS-Key password: java.security.UnrecoverableKeyException: Password must not be null

如果我使用keytool刪除我已加載的所有客戶端證書,然後將異常更改爲

**導致:java.security.KeyStoreException:在k中找不到私鑰eystore!**
在org.apache.commons.ssl.KeyStoreBuilder.validate(KeyStoreBuilder.java:269)
在org.apache.commons.ssl.KeyStoreBuilder.build(KeyStoreBuilder.java:129)
在組織.apache.commons.ssl.KeyMaterial。(KeyMaterial.java:179)
at org.apache.commons.ssl.KeyMaterial。(KeyMaterial.java:170)
at org.apache.commons.ssl.KeyMaterial。( KeyMaterial.java:160)
在org.apache.commons.ssl.KeyMaterial。(KeyMaterial.java:64)
在org.apache.commons.ssl.KeyMaterial。(KeyMaterial.java:114)
在組織.apache.commons.ssl.KeyMaterial。 (KeyMaterial.java:89)
在org.apache.commons.ssl.SSL。(SSL.java:142)
在org.apache.commons.ssl.SSLClient。(SSLClient.java:59)
在org.apache.commons.ssl.HttpSecureProtocol。(HttpSecureProtocol.java:55)
在org.apache.commons.httpclient.contrib.ssl.EasySSLProtocolSocketFactory。(EasySSLProtocolSocketFactory.java:94)

片段輸出中:

keyStore在:/usr/java/jdk1.6.0_11/jre/lib/security/cacerts
密鑰倉庫類型是:JKS
密鑰庫提供的是:
初始化密鑰庫
型SunX509
的trustStore的 INIT的KeyManager是: /usr/java/jdk1.6。0_11/JRE/lib/security中/ cacerts的
的trustStore類型:JKS
的trustStore提供商:
初始化信任
添加爲受信任的證書:
主題:CN = SwissSign白金CA - G2,O = SwissSign AG, C = CH
發行機構:CN = SwissSign Platinum CA-G2,O = SwissSign AG,C = CH
算法:RSA;編號:0x4eb200670c035d4f

一大堆默認的受信任的證書這裏剪斷...
的SecureRandom
的觸發播種完成播種的SecureRandom
@@@@@@@@@@ EXCEPTION
java.security .KeyStoreException:在密鑰庫中找不到私鑰!

任何想法?

回答

1

java.security.KeyStoreException:在密鑰庫中找不到私鑰!

此異常特別指出您嘗試加載的密鑰庫中沒有私鑰。
對於作爲Java默認信任庫的cacerts,這是真的!

但是,對於您發佈的代碼(意思是您沒有真正發佈任何代碼),或者您沒有對您嘗試加載的密鑰庫進行任何說明的事實不可能在此方面爲您提供幫助。

+1

客戶端證書(及其私鑰)必須位於客戶端的密鑰存儲區中,而不是信任存儲區中。 Java中沒有默認密鑰存儲區(僅默認信任存儲區)。 – Bruno 2012-01-01 17:24:41

+0

@ Bruno:是的,我同意。只是他發佈的代碼不清楚他的密鑰庫是什麼。 – Cratylus 2012-01-01 17:35:15

+0

我已經在cacerts中加載了客戶端cert/pvt密鑰,然後得到「org.apache.commons.ssl.ProbablyBadPasswordException:可能是錯誤的JKS-Key密碼:java.security.UnrecoverableKeyException:密碼不能爲空」。從密鑰庫中刪除條目將導致「java.security.KeyStoreException:在密鑰庫中找不到私鑰!」

任何方式都沒有運氣! – Sunny 2012-01-02 21:37:56