我使用 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
and truststore
?
非常感谢。