Когда мы обновили наш сервер разработки 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
Это в журнал ошибок-0.xml:
Сертификат с субъектом CN = www.sslshopper.com, OU = Domain Control Validated, 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 = США, не доверяют. Проверка завершилась ошибкой 3659.
Я думаю, это сообщение довольно ясное. Я также заметил, что System.getProperty("javax.net.ssl.trustStore")
возвращает null, но это также происходит на сервере 8.5.3, где это работает. Я попытался установить trustStore с помощью setProperty
но ошибка все та же.
Обновление 2
Работает с Код Саймона который использует createSocket
. Но весь наш код использует java.net.URL
, UrlConnection
, HttpsUrlConnection
или HTTP-клиент Apache. Некоторые из них предоставляются сторонними поставщиками в виде JAR. Мы не можем изменить все, чтобы использовать createSocket
.
Любые идеи? Спасибо.
Итак, для Domino 9, когда была добавлена новая функция OpenSocial, многие функции были изменены в отношении сертификатов, чтобы упростить обслуживание.
Таким образом, существует новый API «com.ibm.domino.napi.ssl.DominoX509TrustManager». Этот API теперь проверяет сертификаты Domino на наличие соответствующего доверенного сертификата, который также перекрестно сертифицирован по сертификату сервера.
Сначала он проверяет САСЕРЫ. Если он не может этого найти, он проверит сертификаты Domino.
Итак, чтобы приведенный выше код работал, вам необходимо сделать следующее.
Откройте клиент Domino Administrator и выберите «Люди и группы -> Сертификаты».
В меню действий выберите «Импортировать интернет-сертификаты».
Выберите соответствующий файл сертификата для импорта в диалоговом окне файла. При импорте может потребоваться структура файла, поэтому при необходимости выберите правильную структуру. Он должен появиться в представлении после завершения.
Откройте документ и в меню действий выберите «Создать перекрестный сертификат».
Появится диалоговое окно. Вы выбираете сертификат и нажимаете ОК.
В следующем диалоговом окне убедитесь, что вы правильно настроили его для вашего сервера. т.е. Правильный сервер и сертификатор. Когда закончите, нажмите Cross Certify.
Это должно создать перекрестный сертификат в представлении:
На этом этапе вам необходимо перезапустить процесс HTTP с помощью следующих команд.
tell http quit
load http