KeyStore和TrustStore不匹配

时间:2016-04-07 09:10:00

标签: java ssl keystore truststore

我有一位客户更换了我们产品组件的密钥库和信任库。更换后,组件无法相互通信(双向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)这一事实是有问题的。

我是对的吗?

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

2 个答案:

答案 0 :(得分:1)

您的问题与 密钥库 和/或 信任库 中的某些缺少的证书相关

一般来说,当客户端向服务器发送请求时,服务器会提供其证书链,该证书链必须包含服务器证书作为第一个条目,然后是其发行者和其他发行者。除非客户端的 truststore 中存在以下证书,否则必须直接对其前面的证书进行认证。

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

对于.jks Java密钥库类型:

:is="com.type"

-For#PKCS12密钥库类型:

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

打印证书后,请检查' 颁发者' 属性。

如果匹配' 所有者'属性,这意味着它是一个自签名证书,您需要添加' 证书[1] '进入 truststore

如果他们不匹配,请尝试以下其中一种选择:

  • 生成 &#39; Y&#39; < / em> &#39; Z&#39; 并将其添加到 密钥库 或替换现有的 密钥库 。是替换它还是添加的决定取决于您的代码如何读取证书。替换可能是更好的选择。
  • 添加 &#39;证书[1]&#39; &#39;颁发者&#39; 密钥库 进入 的 信任 即可。

如果 &#39;证书的 &#39;发行人&#39; 的证书[1&#39; 密钥库 中的已存在于 信任库 中,我希望如此SSL握手成功。

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

1)获取 颁发者 的公开证书,该证书存储在 .cer 文件中。如果 颁发者 是自行生成的,并且您可以访问其 密钥库 ,则证书和使用以下命令从那里导出:

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

2)将 .cer 文件导入 信任库

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

答案 1 :(得分:0)

  

我是对的吗?

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