当我们将 Domino 开发服务器从 8.5.3 升级到 9 时,从 Java 代码到具有GoDaddy证书的站点的 HTTPS 连接停止工作。与具有DigiCert证书的服务器的连接工作正常。这在代理和 XPage 中都会发生。
这是一个 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)都有代码,这些代码与此 URL 建立 HTTPS 连接。
更新 1
这是在error-log-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=Scottsdale, ST=Arizona, C=US,不受信任。验证失败,错误 3659。
我认为这个信息很明确。我还注意到System.getProperty("javax.net.ssl.trustStore")
返回 null 但这也发生在 8.5.3 服务器中。我尝试将 trustStore 设置为setProperty
但错误仍然相同。
更新 2
它与使用createSocket
. 但是我们所有的代码都使用java.net.URL
、UrlConnection
或HttpsUrlConnection
Apache HTTP 客户端。其中一些由第 3 方作为 JAR 提供。我们不能将所有这些更改为 use createSocket
。
有任何想法吗?谢谢。
因此,对于 Domino 9,随着新功能 OpenSocial 的添加,围绕证书更改了许多功能,以使其更易于维护。
因此,有一个新的 API“com.ibm.domino.napi.ssl.DominoX509TrustManager”。此 API 现在所做的是检查 Domino 证书以查找相关的受信任证书,该证书也针对服务器证书进行了交叉认证。
它首先检查 CACERTS。如果它找不到这个,那么它将检查 Domino 证书。
因此,为了使上面的代码正常工作,您需要执行以下操作。
打开 Domino Administrator 客户端并选择“People and Groups -> Certificates”。
在操作菜单中选择“导入 Internet 证书”。
使用文件对话框选择要导入的相关证书文件。导入时它可能会要求您提供文件结构,因此请根据需要选择正确的结构。一旦完成,它应该出现在视图中。
打开文档并从操作菜单中选择“创建交叉证书”。
弹出一个对话框。您选择证书并单击确定。
下一个对话框确保您已为您的服务器正确设置。IE。正确的服务器和验证者。完成后单击交叉验证。
这应该在视图中创建一个交叉证书:
此时需要使用以下命令重启 HTTP 进程。