KeyStore 和 TrustStore 不匹配

KeyStore and TrustStore mismatch

我有一个客户更换了我们产品组件的密钥库和信任库。更换后组件无法相互通信(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

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

信任库
entry1 - root
证书[1] MD5: Z
entry2 - 中级
证书[1] MD5: Y

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

我说的对吗?

你能看出他们的密钥库和信任库的构建方式有任何其他问题吗?

Am I right?

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

您的问题似乎与您的 keystore and/or 中缺少的某些证书​​有关信任库.

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

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

对于 .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]' 进入 truststore.

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

  • 生成一个新的 'cert[1]'[=151= 之一签名]'Z' 并将其添加到 keystore 或替换现有的。是替换它还是添加它取决于您的代码如何读取证书。更换可能是更好的选择。
  • 加上'cert[1]''Issuer'的当前keystore导入 信任库.

如果'Issuer'的证书[=156= 密钥库中的]已存在于信任库中,我本以为 SSL 握手会成功。

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

1) 获取颁发者的Public证书,该证书存储在 .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]