繁体   English   中英

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

[英]Mutual SSL - getting the key/truststores in the proper formats

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

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

非常感谢。

我终于想通了。 我使用了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

恭喜,这是有效的truststore

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

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

  • 在Portecle中打开钥匙

  • File> Open Keystore>选择我们上面保存的clientKeys.p12
  • 输入上面选择的密码

  • 使用Portecle转换为JKS

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

  • 保存密钥库

  • 在Portecle中执行以下操作:文件>将密钥库另存为>输入名称,例如clientKeyStore.jks。
  • 点击保存

已完成

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

要查看如何现在使用它们的示例,您可以签出: 具有双向SSL的SOAP-如何发送凭据?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM