Я работаю с продуктом, называемым hermes, который является шлюзом обмена сообщениями ebXML. В этой конкретной установке Гермесу необходимо подписать исходящее сообщение с использованием сертификата сервера, который мы загрузили через IE в формате p12 (.pfx) от партнера, чья платформа мы интегрируем.Ошибка Java SSL: невозможно получить цепочку сертификатов
Я проверил, что пароль правильный, и я также указал правильный псевдоним.
Этот сертификат также был установлен в 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
Хотя вы можете использовать тот же сертификат X.509 для сервера TLS/SSL (например, HTTPS) и подписывать документ XML/SOAP. Неясно, что вы говорите, что вам нужно использовать этот сертификат для сервера. Из этого вопроса звучит так, что вы только установили его на Tomcat, чтобы попробовать его против SSLShopper. Если это не предназначено для использования для сервера SSL/TLS, это объясняет, что CN (или SAN) не обязательно должно совпадать с именем хоста. Не могли бы вы прояснить это? Вы используете его как клиент-сертификат? – Bruno
Это сертификат сервера. Сервер приложений также должен быть настроен с сертификатом для этого приложения. Он генерируется путем заполнения формы онлайн на веб-сайте партнера, а затем загрузки ее через IE путем ее экспорта или чего-то еще. Я не был тем, кто сделал этот шаг. – udeleng
Если вы хотите использовать это как сертификат сервера, вам понадобится его содержать запись DNS-объекта Subject Alternate Name (см. Расширение SAN) для предполагаемого имени хоста (если нет записи SAN, это должен быть CN). Возможно, вам придется обратиться к эмитенту и повторно подать заявку на получение сертификата. Кстати, какую версию JRE вы используете? – Bruno