当我们将 Domino 开发服务器从 8.5.3 升级到 9 时,Java 代码到网站的 HTTPS 连接出现了去吧爸爸证书停止工作。连接到服务器时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-根目录.crt没有结果。我还尝试重命名证书文件并从 8.5.3 服务器复制一个,但这也无济于事。在进行这些更改后,我一直在启动 HTTP 和 Domino 服务器。
当然,我可以使用不关心证书的 Java 代码,但我认为这不是生产的最佳解决方案。此外,我们在很多不同的地方(包括 JAR)都有代码可以与此 URL 建立 HTTPS 连接。
更新 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
Apache HTTP Client。其中一些由第三方以 JAR 形式提供。我们无法将所有这些更改为使用createSocket
。
有什么想法吗?谢谢。
答案1
因此对于 Domino 9,随着新功能 OpenSocial 的添加,围绕证书的许多功能都发生了改变,以使其更易于维护。
因此,有一个新的 API“com.ibm.domino.napi.ssl.DominoX509TrustManager”。此 API 的作用是检查 Domino 证书中是否存在相关的受信任证书,该证书也与服务器证书进行了交叉认证。
它首先检查 CACERTS。如果找不到,它将检查 Domino 证书。
因此,为了使上述代码正常工作,您需要执行以下操作。
打开 Domino Administrator 客户端并选择“个人和组 -> 证书”。
在操作菜单中选择“导入 Internet 证书”。
使用文件对话框选择要导入的相关证书文件。导入时可能会要求您提供文件结构,因此如果需要,请选择正确的结构。完成后,它应该出现在视图中。
打开文档并从操作菜单中选择“创建交叉证书”。
弹出一个对话框。选择证书并单击“确定”。
下一个对话框确保您已正确设置了服务器。即正确的服务器和认证者。完成后单击“交叉认证”。
这应该在视图中创建一个交叉证书:
此时需要使用以下命令重新启动HTTP进程。
tell http quit
load http