【问题标题】:Mutual SSL - getting the key/truststores in the proper formats相互 SSL - 以正确的格式获取密钥/信任库
【发布时间】:2012-08-10 01:58:25
【问题描述】:

我使用 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 连接到他们的网络服务。为此,我知道我需要在 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 代码是合法的,我如何确定我已正确创建了 keystoretruststore

非常感谢。

【问题讨论】:

    标签: java soap jaxb ssl pki


    【解决方案1】:

    我终于想通了。我使用了 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 中保存密钥库:

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

    恭喜,这是有效的 truststore

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

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

    • 在 Portecle 中打开钥匙

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

    • 使用 Portecle 转换为 JKS

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

    • 保存密钥库

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

    完成

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

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

    【讨论】:

      猜你喜欢
      • 2019-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-22
      • 2015-04-06
      • 1970-01-01
      • 1970-01-01
      • 2021-01-31
      相关资源
      最近更新 更多