【问题标题】:KeyStore and TrustStore mismatchKeyStore 和 TrustStore 不匹配
【发布时间】:2016-07-28 01:30:10
【问题描述】:

我有一位客户更换了我们产品组件的密钥库和信任库。更换后组件无法相互通信(2 路 SSL)。

在 SSL 日志中我看到:
http-nio-8100-exec-2, fatal error: 42: null cert chain javax.net.ssl.SSLHandshakeException: null cert chain %% Invalidated: [Session-6, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256] http-nio-8100-exec-2, SEND TLSv1.2 ALERT: fatal, description = bad_certificate http-nio-8100-exec-2, WRITE: TLSv1.2 Alert, length = 2 http-nio-8100-exec-2, fatal: engine already closed. Rethrowing javax.net.ssl.SSLHandshakeException: null cert chain

他们在双方都配置了相同的密钥库和信任库文件。 我已经打开了他们的密钥库和信任库,它们是这样构建的:
keystore
entry1 - 服务器
证书[1] MD5: X
证书[2] MD5: Y
证书[3] MD5: Z

信任库
entry1 - 根
证书[1] MD5: Z
entry2 - 中级
证书[1] MD5:是的

在我看来,信任库中缺少密钥库(使用 MD5 X)中的 cert[1] 这一事实是有问题的。

我说的对吗?

您是否发现他们的密钥库和信任库的构建方式有任何其他问题?

【问题讨论】:

  • 您的组件是双向通信还是客户端-服务器架构?是 1-way SSL 还是 2-way SSL?
  • 两种方式。我也会更新问题。
  • 如果它是 2-way SSL,你应该在栅栏的两边都有一个密钥库和信任库,你没有在你的问题中指定。你也不清楚它失败的方式。您需要在帖子中更加具体。
  • 谢谢。我已经添加到问题中:他们在双方都配置了相同的密钥库和信任库文件。它以哪种方式失败仍然重要吗?
  • 在这种情况下方向应该无关紧要。密钥库中的 cert[1] 是自签名证书吗?

标签: java ssl keystore truststore


【解决方案1】:

您的问题似乎与您的 keystore 和/或 truststore 中的某些缺少证书有关.

一般来说,当客户端向服务器发送请求时,服务器会显示其证书链,其中必须包括服务器的证书作为第一个条目,然后是其颁发者和其他颁发者。除非它存在于客户端的 truststore 中,否则后面的每个证书都必须直接证明它前面的证书。

您需要检查 keystore 中的 cert[1] 是否为自签名证书。您可以通过以下方式实现:

对于 .jks Java 密钥库类型:

keytool -list -v -keystore [keystore-file-name].jks

-对于#PKCS12 密钥库类型:

keytool -list -keystore [keystore-file-name].p12 -storetype PKCS12 -v

打印证书时,检查'Issuer'属性。

如果匹配 'Owner' 属性,则表示它是自签名证书,您需要将 'cert[1]' 添加到信任库

如果它们不匹配,请尝试以下替代方法之一:

  • 生成由 'Y' 或签名的新 'cert[1]' 'Z' 并将其添加到 keystore 或替换现有的。是否替换它或添加它的决定取决于您的代码如何读取证书。更换可能是更好的选择。
  • 添加'cert[1]'的当前'Issuer' em>keystore 进入 信任库

如果'cert[1''Issuer'的证书在 keystore 已经存在于 truststore 中,我预计 SSL 握手会成功。

以下是将颁发者添加到信任库的方法:

1) 获取 issuer 的公共证书,该证书存储在 .cer 文件中.如果 issuer 是自行生成的,并且您可以访问它的 keystore,则可以导出证书从那里使用以下命令:

keytool -export -keystore [issuer-keystore].jks -alias [alias]-file [output-file-name].cer

2) 将 .cer 文件导入 truststore

keytool -importcert -file [output-file-name].cer -keystore [truststore-file-name].jks -alias [alias]

【讨论】:

  • cert[1] 的颁发者和所有者不匹配,这是否意味着它是自签名的? cert[2] owner 和 issuer 也不匹配,cert[3] owner 和 issuer 匹配。
  • 还有一个问题 - 在我创建新证书后[1] 我需要用现有证书替换它,对吗?不只是添加它。
  • 您能否解释一下导致问题的原因?
  • 谢谢。如何将 cert[1] 的颁发者添加到信任库?
  • 我已经更新了我的答案。但是,您要查找的信息也可以在 Internet 上找到。如果您需要准确快速的答案,您确实需要在帖子中具体说明。否则投票将与您的帖子背道而驰。请指定尽可能多的信息以避免使用 cmets 进行冗长的对话。总是乐于提供帮助。
【解决方案2】:

我说的对吗?

没有。只要信任库包含密钥库证书链中的证书之一,它就应该信任密钥库中的证书。

【讨论】:

  • 在我的问题中看到,我附上了 Java 的 SSL 日志中的错误
  • 此外,什么不起作用:更换后组件无法相互通信。
猜你喜欢
  • 2023-02-02
  • 1970-01-01
  • 1970-01-01
  • 2018-07-19
  • 2023-04-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多