我正在使用一个名为hermes的产品,它是一个ebXML消息传递网关。在这个特定的安装中,Hermes需要使用一个服务器证书来签署一条传出消息,该证书是我们通过IE以p12格式(.pfx)从我们正在与其集成的平台上的合作伙伴下载的。
我已经验证了密码是正确的,我也指定了正确的别名。
此证书也安装在Tomcat中。然后,我通过SSLShopper.com中的工具对证书进行了测试。该工具报告的问题是证书中的公共名称与服务器的域名不匹配。我不知道这是否是原因。实际上,在申请证书时没有指定公共名称的地方。他们要名字和姓等。
我应该指出,基于SSLShopper测试,我的证书链是:
MyServer -> MyPartner
其中MyPartner不是CA (这意味着它不是FF的证书对话框中列出的)。
我希望外面有人知道是什么让我被绊倒了。
Hermes配置:
<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发布于 2012-01-16 10:52:23
SSL证书是一个潜在问题和错误配置的巨大雷区:如果不了解哪些证书是由服务器交付的--记住,可能有或需要有多个证书--这是不可能诊断的。
一个很可能的原因是服务器没有交付一组允许建立完整信任链的证书。或者,信任路径导致的根证书可能不在Java的根证书存储区中。
在查看代码之前,请确保先检查这些配置问题。
您不能使用浏览器轻松地检查信任链,因为它们缓存中间证书,允许您忽略服务器应该交付它的事实,但事实并非如此。IE也可能在Windows Update中默默地寻找缺少的中间服务器。
首先检查是否有一个处女Firefox可以验证完整的信任路径:安装一个新鲜的Firefox,或者删除Firefox文件cert8.db中的中间证书缓存存储(当Firefox没有运行时)。
如果这个新鲜出炉的Firefox确实接受证书,请检查根证书是否在Java证书存储中。
只有在这一切之后,我才会开始分拆代码。
如果有人想深入研究SSL及其问题,英国曼彻斯特OWASP的相关演讲幻灯片[pdf]有一些来自分会会议的
发布于 2012-01-17 07:58:08
这可能不是上述问题的解决方案,但我们的合作伙伴给我们发送了新的p12密钥存储库,然后我在Tomcat和Hermes中配置了它,之后,一切都如愿以偿。
https://stackoverflow.com/questions/8878346
复制相似问题