在使用用于认证的客户端证书的过程中,我决定使用not-yet-commons-ssl-0.3.11.jar。这导致了另一个问题--调用EasySSLProtocolSocketFactory
或StrictSSLProtocolSocketFactory
上的构造函数的简单操作将产生异常。
代码在一个简单的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);
}
}}
为了用旧的库隔离问题,我将上面的代码放在一个包含这些jars的目录中(这些是类路径中唯一的jars ):
因此,对于cacerts
密钥库中的一些客户端证书,我得到:org.apache.commons.ssl.ProbablyBadPasswordException: Probably bad JKS-Key password: java.security.UnrecoverableKeyException: Password must not be null
如果使用keytool
删除已加载的所有客户端证书,则异常将更改为
\*\*Caused by: java.security.KeyStoreException: No private keys found in keystore!\*\* at org.apache.commons.ssl.KeyStoreBuilder.validate(KeyStoreBuilder.java:269) at org.apache.commons.ssl.KeyStoreBuilder.build(KeyStoreBuilder.java:129) at org.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) at org.apache.commons.ssl.KeyMaterial.(KeyMaterial.java:64) at org.apache.commons.ssl.KeyMaterial.(KeyMaterial.java:114) at org.apache.commons.ssl.KeyMaterial.(KeyMaterial.java:89) at org.apache.commons.ssl.SSL.(SSL.java:142) at org.apache.commons.ssl.SSLClient.(SSLClient.java:59) at org.apache.commons.ssl.HttpSecureProtocol.(HttpSecureProtocol.java:55) at org.apache.commons.httpclient.contrib.ssl.EasySSLProtocolSocketFactory.(EasySSLProtocolSocketFactory.java:94)
输出中的片段:
/usr/java/jdk1.6.0_11/jre/lib/security/cacerts keyStore is: keyStore类型是: keyStore提供者是: init密钥库 SunX509类型的init密钥管理器 /usr/java/jdk1.6.0_11/jre/lib/security/cacerts trustStore is: trustStore类型是: trustStore提供者是: init信任库 添加为可信证书: 主题: CN=SwissSign白金CA - G2,O=SwissSign AG,C=CH 发行人: CN=SwissSign白金CA - G2,O=SwissSign AG,C=CH 算法: RSA;序列号: 0x4eb200670c035d4f所有默认可信证书在这里被剪掉. SecureRandom的触发种子 干播SecureRandom “例外” java.security.KeyStoreException:在密钥库中找不到私钥!
有什么想法吗?
发布于 2011-12-31 21:20:23
java.security.KeyStoreException:在密钥库中找不到私钥!
此异常特别抱怨您要加载的密钥库中没有私钥。
对于cacerts
,这是Java的默认信任库,这是正确的!
但是,对于您已经发布的代码(意味着您没有真正发布任何代码),或者您没有提到您正在尝试加载的密钥存储库,在这方面是不可能帮助您的。
https://stackoverflow.com/questions/8663358
复制相似问题