0

我使用 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 asJKS` 文件。

假设 Java 代码是合法的,我怎么能确定我已经正确创建了keystoreand truststore

非常感谢。

4

1 回答 1

0

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

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

注意:一个总是令人困惑的点:就 Portecle / Java 而言,“信任库”和“密钥库”都是密钥库。唯一的区别是我们在客户端用作密钥库的密钥库除了公共证书之外还有我们的私钥。

使用服务器证书构建的 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 中保存密钥库:

  • 文件 > 将密钥库另存为... >
  • 输入两次信任库密码
  • 输入名称保存,如clientTrustStore.jks

恭喜,这是有效的truststore

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

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

  • 在 Portecle 中打开钥匙

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

  • 使用 Portecle 转换为 JKS

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

  • 保存密钥库

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

完成的

现在您拥有正确配置的clientTrustStore.jksclientKeyStore.jks来验证您的客户端。

要查看现在如何使用这些的示例,您可以查看: 具有相互 SSL 的 SOAP - 如何通过凭据发送?

于 2012-08-10T20:19:01.620 回答