我使用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


我使用的keystoretruststore是从浏览器导出的,其中客户端私钥为PKCS,服务器证书为x509 Cert PKCS#7 w/ Chain'. Then opened them up in Portecle and exported them both as JKS`文件。

假设Java代码合法,如何确定正确创建了keystoretruststore

非常感谢。

最佳答案

我终于想通了。我使用了FireFox和Portecle

在浏览器中安装服务器证书和私钥。

注意:一个总是令人困惑的地方:就Portecle / Java而言,“ truststore”和“ keystore”都是密钥库。唯一的不同是,我们在客户端中用作密钥库的密钥将具有除公共证书之外的私有密钥。

使用服务器证书构建的TrustStore:


转到该地址处的URL,单击地址栏旁边的(锁定图标,显示已启用SSL)
安全选项卡>查看证书>详细信息选项卡>导出按钮
选择类型:X.509带链证书(PKCS#7)。
另存为ffTestServerCert.crt
通过以下方法在Portecle中打开:检查菜单>检查证书>选择ffTestServerCert.crt
您现在可以看到其中包含的证书(例如,我看到3个)。每个都需要自己导出。单击页面顶部以及每个按钮的箭头按钮:
点击“ PEM编码”按钮
保存按钮
另存为.pem文件在磁盘上(例如,说我有caCert1.pem,caCert2.pem,caCert3.pem)
在Portecle中创建新的密钥库:File> New Keystore> JKS
对于从上方导出的每个证书(caCert1.pem,caCert2.pem,caCert3.pem),请执行以下操作:
工具>导入可信证书>选择.pem>导入按钮
弹出消息框,提示我们需要确定我们是否信任此证书。
单击确定>确定(如果您信任证书)>是>输入别名(我将其保留为默认值)>确定
对要导入的任何其他证书重复上述步骤(我全部完成了3个)。
在Portecle中保存密钥库:
文件>将密钥库另存为...>
输入信任库密码两次
输入名称以将其另存为,例如clientTrustStore.jks


恭喜,这是有效的信任库。

使用私钥和服务器证书构建的KeyStore:


首先将私钥导入FireFox(或Chrome或IE)
使用浏览器以PKCS格式导出私钥。
Firefox>首选项>高级选项卡>加密选项卡>查看证书>您的证书
选择要导出的文件,然后单击“备份”按钮
(这里只有选项是PKCS12格式,这是我们想要的)
选择一个名称-clientKeys.p12
输入密钥库的密码
应该说它们已导出,请单击“确定”。
在Portecle中打开钥匙
File> Open Keystore>选择我们上面保存的clientKeys.p12
输入上面选择的密码
使用Portecle转换为JKS
工具>更改密钥库类型> JKS
阅读有关当前类型如何不支持密钥对输入密码的警告消息
重要说明:此操作为密钥对条目password设置内部密码。
要更改内部密钥对条目的密码,请在Portecle的文件中选择任何“密钥对”(它们的图标将是一对密钥,位于另一个密钥的顶部)
右键单击“密钥对条目”>“设置密码”
输入旧密码(即“ password”),然后输入所需的新密码
打好
保存密钥库:
在Portecle中执行以下操作:文件>将密钥库另存为>输入名称,例如clientKeyStore.jks。
点击保存


已完成

现在,您已经具有正确配置的clientTrustStore.jks和clientKeyStore.jks用于验证客户端。

要查看如何使用这些示例,您可以查看以下内容:
SOAP with mutual SSL - how to send over credentials?

10-06 16:00