在使用 Client certificates for authentication的過程中,我決定使用 not-yet-commons-ssl-0.3.11.jar。這導致了另一個問題 - 在EasySSLProtocolSocketFactory
或StrictSSLProtocolSocketFactory
上調用構造函數的簡單行爲將產生一個異常。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);
}
} }
要與舊庫隔離的問題,我把上面的代碼與這些罐子的目錄(這些在類路徑中的唯一罐子):
- 的HttpClient-4.0.1.jar
- 還未公共-SSL-0.3.11.jar
- 公地httpclient的-3.1.jar
- 的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:在密鑰庫中找不到私鑰!
任何想法?
客戶端證書(及其私鑰)必須位於客戶端的密鑰存儲區中,而不是信任存儲區中。 Java中沒有默認密鑰存儲區(僅默認信任存儲區)。 – Bruno 2012-01-01 17:24:41
@ Bruno:是的,我同意。只是他發佈的代碼不清楚他的密鑰庫是什麼。 – Cratylus 2012-01-01 17:35:15
我已經在cacerts中加載了客戶端cert/pvt密鑰,然後得到「org.apache.commons.ssl.ProbablyBadPasswordException:可能是錯誤的JKS-Key密碼:java.security.UnrecoverableKeyException:密碼不能爲空」。從密鑰庫中刪除條目將導致「java.security.KeyStoreException:在密鑰庫中找不到私鑰!」
任何方式都沒有運氣! – Sunny 2012-01-02 21:37:56