尝试访问 HTTPS URL 时,Domino 9 中出现 Java CertificationException

尝试访问 HTTPS URL 时,Domino 9 中出现 Java CertificationException

当我们将 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.URLUrlConnectionHttpsUrlConnectionApache HTTP Client。其中一些由第三方以 JAR 形式提供。我们无法将所有这些更改为使用createSocket

有什么想法吗?谢谢。

答案1

因此对于 Domino 9,随着新功能 OpenSocial 的添加,围绕证书的许多功能都发生了改变,以使其更易于维护。

因此,有一个新的 API“com.ibm.domino.napi.ssl.DominoX509TrustManager”。此 API 的作用是检查 Domino 证书中是否存在相关的受信任证书,该证书也与服务器证书进行了交叉认证。

它首先检查 CACERTS。如果找不到,它将检查 Domino 证书。

因此,为了使上述代码正常工作,您需要执行以下操作。

  1. 打开 Domino Administrator 客户端并选择“个人和组 -> 证书”。

    人员和群组选项卡,证书视图

  2. 在操作菜单中选择“导入 Internet 证书”。

    菜单设置

  3. 使用文件对话框选择要导入的相关证书文件。导入时可能会要求您提供文件结构,因此如果需要,请选择正确的结构。完成后,它应该出现在视图中。

    视图显示已导入的证书。

  4. 打开文档并从操作菜单中选择“创建交叉证书”。

    创建交叉证书的菜单选项

  5. 弹出一个对话框。选择证书并单击“确定”。

    交叉证书对话框

  6. 下一个对话框确保您已正确设置了服务器。即正确的服务器和认证者。完成后单击“交叉认证”。

    发出交叉证书对话框

这应该在视图中创建一个交叉证书:

显示交叉证书的视图

此时需要使用以下命令重新启动HTTP进程。

tell http quit 
load http

相关内容