Java SSL错误:无法检索证书链
我正在使用名为hermes的产品,它是ebXML消息传递网关。在此特定安装中,爱马仕需要使用服务器证书签署传出消息,该服务器证书是我们通过以p12格式(.pfx)从IE下载的合作伙伴通过IE下载的。Java SSL错误:无法检索证书链
我已验证密码是否正确,并且我还指定了正确的别名。
此证书也安装在Tomcat中。然后我通过SSLShopper.com中的一个工具对证书进行了测试。该工具报告的问题是证书中的通用名称与服务器的域名不匹配。我不确定这是否是原因。实际上,在申请证书时没有地方可以指定一个通用名称。他们问姓和名等
我应该根据SSLShopper测试注意的是,我的证书链是:
的MyServer - > MyPartner的
其中MyPartner的是不是一个CA(这意味着它不是FF的认证对话中列出的那些)。
我希望有人知道可能会让我绊倒。
爱马仕配置:
<component id="keystore-manager-for-signature" name="Key Store Manager for Digital Signature">
<class>hk.hku.cecid.piazza.commons.security.KeyStoreManager</class>
<parameter name="keystore-location" value="/opt/mycompany/certs/MyCert.pfx"/>
<parameter name="keystore-password" value="12345678"/>
<parameter name="key-alias" value="e38a429e10666c"/>
<parameter name="key-password" value="12345678"/>
<parameter name="keystore-type" value="PKCS12"/>
<parameter name="keystore-provider" value="org.bouncycastle.jce.provider.BouncyCastleProvider"/>
</component>
爱马仕错误:
2012-01-16 08:02:47 [Thread-28 ] <ERROR> <cecid.ebms.spa> <Cannot send the message>
hk.hku.cecid.piazza.commons.net.ConnectionException: Unable to send HTTP SOAP request
by javax.net.ssl.SSLException: java.lang.RuntimeException: Unable to retrieve certificate chain
by java.lang.RuntimeException: Unable to retrieve certificate chain
by java.lang.NullPointerException
at hk.hku.cecid.piazza.commons.soap.SOAPHttpConnector.send(SOAPHttpConnector.java:112)
at hk.hku.cecid.ebms.spa.task.OutboxTask.sendMsgByHttp(OutboxTask.java:574)
at hk.hku.cecid.ebms.spa.task.OutboxTask.execute(OutboxTask.java:444)
at hk.hku.cecid.piazza.commons.module.ActiveThread.run(ActiveThread.java:90)
at java.lang.Thread.run(Thread.java:619)
Caused by: javax.net.ssl.SSLException: java.lang.RuntimeException: Unable to retrieve certificate chain
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:190)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1623)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1586)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java:1569)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1154)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1131)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:434)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:904)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:230)
at hk.hku.cecid.piazza.commons.soap.SOAPHttpConnector.send(SOAPHttpConnector.java:84)
... 4 more
SSL证书是潜在的问题和错误配置一个巨大的雷区:没有看到哪个证书被服务器下发 - 记住可能有或者需要多个 - ,这是不可能诊断的。
一个很可能的原因是服务器没有提供允许建立完整信任链的一组证书。或者,信任路径导致的根证书可能不在Java的根证书存储区中。
请确保在查看代码之前先检查这些配置问题。
您无法使用浏览器轻松检查信任链,因为它们会缓存中间证书,因此您可能会错过服务器应该需要传递信息,但事实并非如此。 IE也可能会在Windows Update中默默寻找缺失的中间体。
首先检查一个处女火狐可以验证的充分信任路径:安装一个新的Firefox的便携式,或在你的Firefox的配置文件cert8.db
删除中间证书缓存存储(Firefox何时不运行)。
如果这款新开箱即用的Firefox确实接受证书,请检查根证书是否位于Java证书存储区中。
只有在这一切之后,我才会开始挑选代码。
如果有人想挖更深的进入SSL和它的问题,有一个从OWASP曼彻斯特chapter meeting一些Related talk slides [pdf],英国
我可以说我的浏览器FF 3.6(在CentOS 5.5上)不会让我用指定的证书访问我的服务器(尽管我可以使用带有警告的Mac来使用Chrome)。来自合作伙伴公司的人员指出,我需要使用没有链条的证书,甚至不需要CA.这可能是问题吗?我对所有这些SSL的东西都很陌生。 – udeleng 2012-01-16 11:25:47
@udeleng:您的证书是否是自签名的(即发卡人DN与主题DN是否相同),还是由您的合作伙伴公司自己的CA签发? – Bruno 2012-01-16 12:07:16
是的,他们发布了它。我们使用他们的在线表单来创建证书,而不是本地keytool。 – udeleng 2012-01-16 12:14:30
这可能不是上述问题的解决方案,但我们的合作伙伴为我们送来新的P12密钥库然后我在Tomcat和Hermes中进行了配置,之后,所有事情都按预期工作。
虽然您可以为TLS/SSL(例如HTTPS)服务器和签署XML/SOAP文档使用相同的X.509证书。从你说的话你不清楚你需要使用该服务器的证书。从这个问题听起来,你只是在Tomcat上设置它来对付SSLShopper。如果它不打算用于SSL/TLS服务器,这可以解释为CN(或SAN)不需要与主机名匹配。你能澄清一下吗?你是否也将它用作客户端证书? – Bruno 2012-01-16 11:00:07
这是一个服务器证书。应用程序服务器还需要配置此应用程序的证书。它是通过在合作伙伴的网站上在线填写表格,然后通过导出它或通过IE下载它而产生的。我不是那个做这一步的人。 – udeleng 2012-01-16 11:38:51
如果要将其用作服务器证书,则需要它包含目标主机名(如果没有SAN条目,则应该是CN)的主题备用名DNS项(请参阅SAN扩展名)。您可能需要联系发行人并重新申请证书。顺便说一句,你使用哪个版本的JRE? – Bruno 2012-01-16 12:05:42