我有一个客户,他取代了我们产品组件的密钥库和信任库。更换后,组件之间无法通信(双向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 -服务器
cert1 MD5: X
cert2 MD5: y
cert3 MD5: Z
信任库
entry1 -根
cert1 MD5: Z
entry2 -中间体
cert1 MD5: y
在我看来,密钥库中的cert1 (使用MD5 X)从信任库中缺失的事实是有问题的。
我说的对吗?
您能看到他们的密钥库和信任库的构建方式还有其他问题吗?
发布于 2016-04-07 11:41:33
看起来,您的问题与密钥库和/或信任库中缺少的证书有关。
一般来说,当客户端向服务器发送请求时,服务器会显示其证书链,该证书链必须包括服务器的证书作为第一个条目,然后是其颁发者和其他颁发者。除非在客户端的信任库中存在证书,否则以下每个证书必须直接验证其前面的证书。
您需要检查cert1 in keystore是否是一个自签名证书。您可以通过以下方式实现这一目标:
对于.jks类型:
keytool -list -v -keystore [keystore-file-name].jks-For #PKCS12 12密钥库类型:
keytool -list -keystore [keystore-file-name].p12 -storetype PKCS12 -v打印证书时,请检查'Issuer'属性。
如果它与'Owner‘属性匹配,则意味着它是一个自签名证书,需要将'cert1’添加到 truststore.中
如果它们不匹配,请尝试下列选项之一:
如果'Issuer' of ‘证书[ keystore中的1’已经存在于信任库中)的证书,我希望SSL握手是成功的。
下面是如何将发行者添加到信任库中::
1)获取颁发机构的公共证书,该证书存储在.cer文件中。如果颁发者是自生成的,并且您可以访问它的密钥存储库,则可以使用以下命令从其中导出证书:
keytool -export -keystore [issuer-keystore].jks -alias [alias]-file [output-file-name].cer2)将.cer文件导入信任库
keytool -importcert -file [output-file-name].cer -keystore [truststore-file-name].jks -alias [alias]发布于 2016-04-07 09:46:52
我说的对吗?
不是的。只要信任存储库包含密钥库的证书链中的一个证书,它就应该信任KeyStore中的证书。
https://stackoverflow.com/questions/36471569
复制相似问题