我使用OpenSSL生成了CSR:
openssl req -out MyCompanyCsr.csr -new -newkey rsa:2048 -nodes -keyout MyCompanyPrivateKey.key
首先,我们有:
- MyCompanyPrivateKey.key
- MyCompanyCsr.csr
然后我将它发送给我们的集成合作伙伴,他们回复了3个文件:
- PartnerIntermediateCa.crt
- PartnerRootCa.crt
- MyCompanyCsr.crt
现在我需要使用相互SSL连接到他们的Web服务。为此,我知道我需要在我的SSLSocketFactory中为JAXB设置信任库和密钥库。
我使用以下方法在Java中实例化密钥库和信任库:
KeyStore trustStore = KeyStore.getInstance("JKS");
InputStream tsis = ClassLoader.getSystemResourceAsStream(trustStorePath);
trustStore.load(tsis, "mypassword".toCharArray());
tsis.close();
KeyStore keyStore = KeyStore.getInstance("JKS");
InputStream ksis = ClassLoader.getSystemResourceAsStream(keyStorePath);
keyStore.load(ksis, "mypassword".toCharArray());
if (ksis != null) {
ksis.close();
}
TrustManagerFactory tmf =
TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(trustStore);
KeyManagerFactory kmf =
KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(keyStore, "mypassword".toCharArray());
但是,尝试在连接服务器时使用此代码会引发SSLHandshakeException
消息http.client.failed
:
com.sun.xml.ws.client.ClientTransportException: HTTP transport error:
javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
我使用的keystore
和truststore
是从我的浏览器导出的,客户端私钥为PKCS
,服务器证书为x509 Cert PKCS#7 w/ Chain'. Then opened them up in Portecle and exported them both as
JKS`文件。
假设Java代码合法,我如何确定我已正确创建keystore
和truststore
?
非常感谢。
答案 0 :(得分:0)
我终于弄明白了。我使用了FireFox和Portecle。
在浏览器中安装服务器证书和私钥。
注意:一个令人困惑的问题:就“Portecle / Java”而言,“truststore”和“keystore”都是 keystore 。唯一的区别是我们使用的那个我们的密钥库在客户端除了公共证书之外还将拥有我们的私钥。
使用服务器证书构建的TrustStore:
将某处保存为ffTestServerCert.crt
通过以下方式在Portecle中打开:检查菜单>检查证书>选择ffTestServerCert.crt
在磁盘上另存为.pem文件(例如,假设我有caCert1.pem,caCert2.pem,caCert3.pem)
在Portecle中创建新的密钥库:文件>新密钥库> JKS
重复您要导入的任何其他证书(我做了所有3)。
将密钥库保存在Portecle中:
恭喜,这是有效的信任库。
使用私钥和服务器证书构建的KeyStore:
应该说它们已导出,请点击“确定”
在Portecle中打开键
输入上面选择的密码
使用Portecle转换为JKS
password
设置内部密码。 点击确定
保存密钥库:
<强>完成强>
现在您已经正确配置了 clientTrustStore.jks 和 clientKeyStore.jks 来验证您的客户端。
要查看现在如何使用这些内容的示例,您可以查看: SOAP with mutual SSL - how to send over credentials?