Java CertificateException в Domino 9 при попытке доступа к URL-адресу HTTPS

Когда мы обновили наш сервер разработки Domino с 8.5.3 до 9, HTTPS-соединения из Java-кода на сайты, имеющие сертификат GoDaddy, перестали работать. Соединения с серверами, имеющими сертификат DigiCert, работают нормально. Это происходит как в агентах, так и в XPages.

Вот пример кода XPage:

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
    <xp:this.beforePageLoad>
             <![CDATA[#{javascript:new java.net.URL("https://www.sslshopper.com/").openStream();]]>
    </xp:this.beforePageLoad>
</xp:view>

Я также пытался с UrlConnection, Вот исключение:

javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: 3659
    com.ibm.jsse2.o.a(o.java:15)
    com.ibm.jsse2.SSLSocketImpl.a(SSLSocketImpl.java:460)
    com.ibm.jsse2.kb.a(kb.java:294)
    com.ibm.jsse2.kb.a(kb.java:533)
    com.ibm.jsse2.lb.a(lb.java:55)
    com.ibm.jsse2.lb.a(lb.java:581)
    com.ibm.jsse2.kb.s(kb.java:11)
    com.ibm.jsse2.kb.a(kb.java:394)
    com.ibm.jsse2.SSLSocketImpl.a(SSLSocketImpl.java:44)
    com.ibm.jsse2.SSLSocketImpl.h(SSLSocketImpl.java:496)
    com.ibm.jsse2.SSLSocketImpl.a(SSLSocketImpl.java:528)
    com.ibm.jsse2.SSLSocketImpl.startHandshake(SSLSocketImpl.java:505)
    com.ibm.net.ssl.www2.protocol.https.c.afterConnect(c.java:83)
    com.ibm.net.ssl.www2.protocol.https.d.connect(d.java:31)
    sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1184)
    com.ibm.net.ssl.www2.protocol.https.b.getInputStream(b.java:40)
    java.net.URL.openStream(URL.java:1022)

...

java.security.cert.CertificateException: 3659
com.ibm.domino.napi.ssl.DominoX509TrustManager.checkServerTrusted(DominoX509TrustManager.java:98)
    com.ibm.jsse2.lb.a(lb.java:468)
    com.ibm.jsse2.lb.a(lb.java:581)
    com.ibm.jsse2.kb.s(kb.java:11)
    com.ibm.jsse2.kb.a(kb.java:394)
    com.ibm.jsse2.SSLSocketImpl.a(SSLSocketImpl.java:44)
    com.ibm.jsse2.SSLSocketImpl.h(SSLSocketImpl.java:496)
    com.ibm.jsse2.SSLSocketImpl.a(SSLSocketImpl.java:528)
    com.ibm.jsse2.SSLSocketImpl.startHandshake(SSLSocketImpl.java:505)
    com.ibm.net.ssl.www2.protocol.https.c.afterConnect(c.java:83)
    com.ibm.net.ssl.www2.protocol.https.d.connect(d.java:31)
    sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1184)
    com.ibm.net.ssl.www2.protocol.https.b.getInputStream(b.java:40)
    java.net.URL.openStream(URL.java:1022)

Я импортировал сертификаты GoDaddy в хранилище ключей domino_path\jvm\lib\security\cacerts в соответствии с этими инструкциями:

http://drcs.ca/blog/adding-godaddy-intermediate-certificates-to-java-jdk/

Но это не помогло, и я также импортировал gd-class2-root.crt без результатов. Я также попытался переименовать файл cacerts и скопировать его с сервера 8.5.3, но это тоже не помогло. После этих изменений я загружал HTTP и сервер Domino.

Конечно, я мог бы использовать код Java, который не заботится о сертификатах, но я считаю, что это не очень хорошее решение для производства. Также у нас есть код во многих разных местах (включая JAR), которые устанавливают HTTPS-соединение с этим URL.

Обновление 1

Это в error-log-0.xml:

Сертификат с темой CN=www.sslshopper.com, OU= контроль домена подтвержден, O=www.sslshopper.com, выдан SERIALNUMBER = 07969287, CN = Go Daddy Secure Certification Authority, OU = http://certificates.godaddy.com/repository, O = "GoDaddy.com, Inc.", L = Скоттсдейл, ST= Аризона, C=US, не является доверенным. Проверка не удалась с ошибкой 3659.

Я думаю, что это сообщение довольно ясно. Я также заметил, что System.getProperty("javax.net.ssl.trustStore") возвращает ноль, но это также происходит на сервере 8.5.3, где это работает. Я попытался установить trustStore с setProperty но ошибка все та же.

Обновление 2

Это работает с кодом Саймона, который использует createSocket, Но весь наш код используют java.net.URL, UrlConnection, HttpsUrlConnection или Apache HTTP Client. Некоторые из них предоставляются третьей стороной в виде JAR. Мы не можем изменить все те, чтобы использовать createSocket,

Есть идеи? Благодарю.

1 ответ

Решение

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

В качестве такового существует новый API "com.ibm.domino.napi.ssl.DominoX509TrustManager". Теперь этот API проверяет сертификаты Domino на наличие соответствующего доверенного сертификата, который также перекрестно сертифицирован по сертификату сервера.

Сначала проверяет в CACERTS. Если он не может найти это, он проверит сертификаты Domino.

Таким образом, чтобы приведенный выше код работал, вам нужно сделать следующее.

  1. Откройте клиент администратора Domino и выберите "Люди и группы -> Сертификаты".

    вкладка люди и группы, просмотр сертификатов

  2. В меню действий выберите "Импорт интернет-сертификатов".

    настройка меню

  3. Выберите соответствующий файл сертификата для импорта с помощью диалогового окна файла. При импорте может запрашиваться структура файла, поэтому при необходимости выберите правильную структуру. Это должно появиться в представлении после завершения.

    Просмотр с указанием импортированного сертификата

  4. Откройте документ и в меню действий выберите "Создать перекрестный сертификат".

    опция меню создания кросс-сертификата

  5. Диалог всплывает. Вы выбираете сертификат и нажимаете ОК.

    диалог кросс-сертификата

  6. В следующем диалоговом окне убедитесь, что он установлен правильно для вашего сервера. то есть. Правильный сервер и сертификатор. Нажмите Cross Certify, когда закончите.

    Диалоговое окно выдачи перекрестного сертификата

Это должно создать перекрестный сертификат в представлении:

вид, показывающий перекрестный сертификат

На этом этапе вам нужно перезапустить процесс HTTP с помощью следующих команд.

tell http quit 
load http
Другие вопросы по тегам