Ошибка SSL Java: невозможно получить цепочку сертификатов - PullRequest
0 голосов
/ 16 января 2012

Я работаю с продуктом hermes, который является шлюзом обмена сообщениями ebXML.В этой конкретной установке Hermes необходимо подписать исходящее сообщение, используя сертификат сервера, который мы загрузили через IE в формате p12 (.pfx) от партнера, с платформой которого мы интегрируемся.

Я проверил, что пароль правильный, и я также указал правильный псевдоним.

Этот сертификат также был установлен в Tomcat.Затем я провел тест на сертификат с помощью инструмента в SSLShopper.com.Проблема, о которой сообщал инструмент, заключалась в том, что общее имя в сертификате не соответствует имени домена для сервера.Я не уверен, может ли это быть причиной.На самом деле, не было места для указания общего имени при подаче заявки на сертификат.Они попросили указать имя, фамилию и т. Д.

Я должен отметить, что на основе теста SSLShopper моя цепочка сертификатов выглядит следующим образом:

MyServer -> MyPartner

гдеMyPartner не является центром сертификации (это означает, что он не входит в список сертифицированных диалогов 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

Ответы [ 2 ]

1 голос
/ 17 января 2012

Возможно, это не решение вышеуказанной проблемы, но наш партнер прислал нам новое хранилище ключей p12, которое я затем настроил в Tomcat и Hermes, после чего все работало как положено.

1 голос
/ 16 января 2012

SSL-сертификаты представляют собой гигантское минное поле потенциальных проблем и неправильной конфигурации: не видя, какие сертификаты доставляются сервером - помните, что их может быть или должно быть больше, чем один - это невозможно диагностировать.

Одной из наиболее вероятных причин является то, что сервер не предоставляет набор сертификатов, позволяющих установить полную цепочку доверия. Кроме того, корневой сертификат, к которому ведет траст доверия, может отсутствовать в хранилище корневых сертификатов Java.

Убедитесь, что сначала вы проверили эти проблемы конфигурации, прежде чем искать в своем коде.

Вы не можете легко проверять доверительные цепочки с помощью браузера, поскольку они кэшируют промежуточные сертификаты, что позволяет упустить тот факт, что сервер должен доставлять его, но это не так. IE также может молча искать недостающие промежуточные звенья в Центре обновления Windows.

Сначала убедитесь, что virgin Firefox может проверить полный путь доверия: установите новый Firefox Portable или удалите промежуточное хранилище кэша сертификатов в файле профиля Firefox cert8.db (когда Firefox не работает ).

Если этот обновленный Firefox действительно принимает сертификат, убедитесь, что корневой сертификат находится в хранилище сертификатов Java.

Только после всего этого я начну разбирать код.

Если кто-то хочет глубже вникнуть в SSL и его проблемы, есть несколько связанных слайдов для обсуждения [pdf] из собрания глав OWASP Манчестер, Великобритания

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...