2012-01-16 6 views
0

Я работаю с продуктом, называемым 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 
+0

Хотя вы можете использовать тот же сертификат X.509 для сервера TLS/SSL (например, HTTPS) и подписывать документ XML/SOAP. Неясно, что вы говорите, что вам нужно использовать этот сертификат для сервера. Из этого вопроса звучит так, что вы только установили его на Tomcat, чтобы попробовать его против SSLShopper. Если это не предназначено для использования для сервера SSL/TLS, это объясняет, что CN (или SAN) не обязательно должно совпадать с именем хоста. Не могли бы вы прояснить это? Вы используете его как клиент-сертификат? – Bruno

+0

Это сертификат сервера. Сервер приложений также должен быть настроен с сертификатом для этого приложения. Он генерируется путем заполнения формы онлайн на веб-сайте партнера, а затем загрузки ее через IE путем ее экспорта или чего-то еще. Я не был тем, кто сделал этот шаг. – udeleng

+1

Если вы хотите использовать это как сертификат сервера, вам понадобится его содержать запись DNS-объекта Subject Alternate Name (см. Расширение SAN) для предполагаемого имени хоста (если нет записи SAN, это должен быть CN). Возможно, вам придется обратиться к эмитенту и повторно подать заявку на получение сертификата. Кстати, какую версию JRE вы используете? – Bruno

ответ

1

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

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

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

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

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

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

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

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

+0

Могу сказать, что мой браузер, FF 3.6 (на CentOS 5.5), не позволит мне получить доступ к моему серверу с данным сертификатом (хотя я могу, если я использую Chrome с Mac с предупреждениями). Лицо из партнерской компании указало, что мне нужно использовать сертификат без цепочки, даже CA. Это может быть проблема. Я довольно новичок во всем этом деле SSL. – udeleng

+0

@udeleng: является ли ваш сертификат самоподписанным (т. Е. Является ли DN эмитента таким же, как DN субъекта), или он был выпущен собственным CA вашей партнерской компании? – Bruno

+0

Да, они его выпустили. Мы использовали свою онлайн-форму для создания сертификата, а не локального keytool. – udeleng

1

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

Смежные вопросы