我有一位客户更换了我们产品组件的密钥库和信任库。更换后,组件无法相互通信(双向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)这一事实是有问题的。
我是对的吗?
你能看到他们的密钥库和信任库的构建方式有任何其他问题吗?
答案 0 :(得分:1)
您的问题与 密钥库 和/或 信任库 中的某些缺少的证书相关
一般来说,当客户端向服务器发送请求时,服务器会提供其证书链,该证书链必须包含服务器证书作为第一个条目,然后是其发行者和其他发行者。除非客户端的 truststore 中存在以下证书,否则必须直接对其前面的证书进行认证。
您需要检查 密钥库 中的 证书[1] 是否为自签名证书。您可以通过以下方式实现此目的:
对于.jks Java密钥库类型:
:is="com.type"
-For#PKCS12密钥库类型:
keytool -list -v -keystore [keystore-file-name].jks
打印证书后,请检查' 颁发者' 属性。
如果匹配' 所有者'属性,这意味着它是一个自签名证书,您需要添加' 证书[1] '进入 truststore 。
如果他们不匹配,请尝试以下其中一种选择:
如果 '证书的 '发行人' 的证书[1' 密钥库 中的已存在于 信任库 中,我希望如此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中的证书。