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.
Таким образом, чтобы приведенный выше код работал, вам нужно сделать следующее.
Откройте клиент администратора Domino и выберите "Люди и группы -> Сертификаты".
В меню действий выберите "Импорт интернет-сертификатов".
Выберите соответствующий файл сертификата для импорта с помощью диалогового окна файла. При импорте может запрашиваться структура файла, поэтому при необходимости выберите правильную структуру. Это должно появиться в представлении после завершения.
Откройте документ и в меню действий выберите "Создать перекрестный сертификат".
Диалог всплывает. Вы выбираете сертификат и нажимаете ОК.
В следующем диалоговом окне убедитесь, что он установлен правильно для вашего сервера. то есть. Правильный сервер и сертификатор. Нажмите Cross Certify, когда закончите.
Это должно создать перекрестный сертификат в представлении:
На этом этапе вам нужно перезапустить процесс HTTP с помощью следующих команд.
tell http quit
load http