相互SSL - 以正确的格式获取密钥/信任库

时间:2012-08-10 01:58:25

标签: java soap jaxb ssl pki

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

非常感谢。

1 个答案:

答案 0 :(得分:0)

我终于弄明白了。我使用了FireFox和Portecle

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

注意:一个令人困惑的问题:就“Portecle / Java”而言,“truststore”和“keystore”都是 keystore 。唯一的区别是我们使用的那个我们的密钥库在客户端除了公共证书之外还将拥有我们的私钥。

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

  • 转到地址处的URL,单击地址栏旁边的(锁定图标,显示启用SSL)
  • 安全标签>查看证书>详细信息标签>导出按钮
  • 选择类型:X.509带链的证书(PKCS#7)。
  • 将某处保存为ffTestServerCert.crt

  • 通过以下方式在Portecle中打开:检查菜单>检查证书>选择ffTestServerCert.crt

  • 您现在可以看到此中包含的证书(例如,我看到3)。每个都需要自己导出。单击页面顶部的箭头按钮,然后单击每个:
  • 点击“PEM编码”按钮
  • 保存按钮
  • 在磁盘上另存为.pem文件(例如,假设我有caCert1.pem,caCert2.pem,caCert3.pem)

  • 在Portecle中创建新的密钥库:文件>新密钥库> JKS

  • 对于上面的每个导出证书(caCert1.pem,caCert2.pem,caCert3.pem),请执行以下操作:
  • 工具>导入可信证书>选择.pem>导入按钮
  • 弹出消息框,说明我们需要确定是否信任此证书。
  • 点击确定>好的(如果您信任证书)>是的>输入别名(我默认保留)>确定
  • 重复您要导入的任何其他证书(我做了所有3)。

  • 将密钥库保存在Portecle中:

  • 文件>将密钥库另存为...>
  • 两次输入 truststore 密码
  • 输入名称将其另存为,例如 clientTrustStore.jks

恭喜,这是有效的信任库

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

  • 首先将私钥导入FireFox(或Chrome或IE)
  • 使用浏览器以PKCS格式导出私钥。
  • Firefox>偏好>高级标签>加密标签>查看证书>您的证书
  • 选择要导出的广告>单击备份按钮
  • (这里只有选项是PKCS12格式,这就是我们想要的)
  • 选择一个名称 - clientKeys.p12
  • 输入密钥库
  • 的密码
  • 应该说它们已导出,请点击“确定”

  • 在Portecle中打开键

  • 文件>打开密钥库>选择我们保存在上面的clientKeys.p12
  • 输入上面选择的密码

  • 使用Portecle转换为JKS

  • 工具>更改密钥库类型> JKS
  • 阅读有关当前类型如何不支持密钥对输入密码的警告消息
  • 重要提示:此操作为密钥对条目password设置内部密码。
  • 要更改内部密钥对条目的密码,请在Portecle中选择文件中的任何“密钥对”(其图标将是一对密钥,位于另一个顶部)
  • 右键点击“密钥对输入”>设置密码
  • 输入旧密码(即'密码')并输入您想要的新密码
  • 点击确定

  • 保存密钥库

  • 在Portecle do:文件>将密钥库另存为>输入名称,例如 clientKeyStore.jks
  • 点击保存

<强>完成

现在您已经正确配置了 clientTrustStore.jks clientKeyStore.jks 来验证您的客户端。

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