尝试访问HTTPS URL时,Domino 9中的Java CertificateException

当我们将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.oa(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 keystore:

http://drcs.ca/blog/adding-godaddy-intermediate-certificates-to-java-jdk/

但是这并没有帮助,我也没有结果导入gd-class2-root.crt 。 我也尝试重命名cacerts文件,并从8.5.3服务器复制一个,但它也没有帮助。 这些更改之后,我一直在启动HTTP和Domino服务器。

当然,我可以使用不关心证书的Java代码,但我认为这不是一个很好的解决scheme。 此外,我们在许多不同的地方(包括JAR)的代码,使HTTPS连接到这个URL。

更新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, 是不可信的 。 validation失败,错误3659。

我觉得这个信息很清楚。 我还注意到System.getProperty("javax.net.ssl.trustStore")返回null,但是在8.5.3服务器中也会发生这种情况。 我试着用setProperty设置trustStore,但是错误仍然是一样的。

更新2

它适用于使用createSocket Simon的代码 。 但是我们所有的代码都使用java.net.URLUrlConnectionHttpsUrlConnection或Apache HTTP Client。 其中有些是由第三方提供的JAR。 我们不能改变所有使用createSocket

有任何想法吗? 谢谢。

所以对于Domino 9来说,随着OpenSocial的新function的添加,很多function都在证书周围进行了更改,以便于维护。

因此,有一个新的API“com.ibm.domino.napi.ssl.DominoX509TrustManager”。 这个API现在所做的是检查相关的可信证书的Domino证书,该证书也是通过服务器证书交叉validation的。

它首先在CACERTS中进行检查。 如果找不到,则会检查Domino证书。

所以为了得到上面的代码,你需要做以下的事情。

  1. 打开Domino Administrator客户端并select“人员和组 – >证书”。

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

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

    菜单设置

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

    显示导入证书的视图。

  4. 打开文档,然后从操作菜单中select“创build交叉证书”。

    创建交叉证书的菜单选项

  5. popup一个对话框。 您select证书并单击确定。

    交叉证书对话框

  6. 下一个对话框确保你的服务器设置正确。 即。 正确的服务器和validation者。 完成后点击交叉validation。

    发出交叉证书对话框

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

查看交叉证书

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

 tell http quit load http