当我们将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.URL , UrlConnection , HttpsUrlConnection或Apache HTTP Client。 其中有些是由第三方提供的JAR。 我们不能改变所有使用createSocket 。
有任何想法吗? 谢谢。
所以对于Domino 9来说,随着OpenSocial的新function的添加,很多function都在证书周围进行了更改,以便于维护。
因此,有一个新的API“com.ibm.domino.napi.ssl.DominoX509TrustManager”。 这个API现在所做的是检查相关的可信证书的Domino证书,该证书也是通过服务器证书交叉validation的。
它首先在CACERTS中进行检查。 如果找不到,则会检查Domino证书。
所以为了得到上面的代码,你需要做以下的事情。
打开Domino Administrator客户端并select“人员和组 – >证书”。

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

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

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

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

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

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

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