Java SSL错误:无法检索证书链



我正在使用一个名为hermes的产品,它是一个ebXML消息网关。在这个特定的安装中,Hermes需要使用服务器证书对传出消息进行签名,该证书是我们通过p12格式(.pfx)的IE从我们正在集成的合作伙伴那里下载的。

我已经验证了密码是否正确,还指定了正确的别名。

该证书也安装在Tomcat中。然后,我通过SSLShopper.com中的一个工具对证书进行了测试。该工具报告的问题是证书中的通用名称与服务器的域名不匹配。我不确定这是否是原因。事实上,申请证书时没有地方指定通用名称。他们询问了姓名等。

我应该注意的是,基于SSLShopper测试,我的证书链是:

MyServer-->MyPartner

其中MyPartner不是CA(意味着它不是FF认证对话框中列出的CA之一)。

我希望有人知道是什么绊倒了我。

爱马仕配置:

<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> 

Hermes错误:

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中静默地查找丢失的中间版本。

首先检查virginFirefox是否可以验证完全信任路径:安装新的Firefox Portable,或删除Firefox配置文件cert8.db中的中间证书缓存存储(当Firefox未运行时)。

如果这个开箱即用的Firefox确实接受了证书,请检查根证书是否在Java证书存储中。

只有在这一切之后,我才会开始拆开代码。

如果有人想更深入地研究SSL及其问题,可以从英国曼彻斯特OWASP分会会议上获得一些相关的演讲幻灯片

这可能不是上述问题的解决方案,但我们的合作伙伴向我们发送了新的p12密钥库,然后我在Tomcat和Hermes中对其进行了配置,之后一切都按预期工作。

最新更新