嘗試訪問 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.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)都有程式碼,這些程式碼使 HTTPS 連接到這個 URL。
更新 1
這是在error-log-0.xml 中:
主題為 CN=www.sslshopper.com、OU=Domain Control Validated、O=www.sslshopper.com、由 SERIALNUMBER=07969287 頒發的證書、CN=Go Daddy 安全證書頒發機構、OU= http://certificates.godaddy.com /repository , O=“GoDaddy.com, Inc.”, L=Scottsdale, ST=Arizona, C=US, is not trust。驗證失敗,出現錯誤 3659。
我認為這個資訊很清楚。我還注意到它
System.getProperty("javax.net.ssl.trustStore")
返回 null 但這也發生在 8.5.3 伺服器中。我嘗試設置 trustStoresetProperty
但錯誤仍然相同。更新 2
它適用於Simon 的程式碼,該程式碼使用
createSocket
. 但是我們所有的程式碼都使用java.net.URL
、UrlConnection
或HttpsUrlConnection
Apache HTTP 客戶端。其中一些是由第 3 方作為 JAR 提供的。我們不能改變所有這些來使用createSocket
。有任何想法嗎?謝謝。
因此,對於 Domino 9,隨著新功能 OpenSocial 的添加,圍繞證書更改了許多功能以使其更易於維護。
因此,有一個新的 API “com.ibm.domino.napi.ssl.DominoX509TrustManager”。現在,此 API 所做的是檢查 Domino 證書以獲取相關的受信任證書,該證書也與伺服器證書進行交叉認證。
它首先在 CACERTS 中進行檢查。如果找不到,它將檢查 Domino 證書。
因此,為了使上面的程式碼正常工作,您需要執行以下操作。
- 打開 Domino Administrator 客戶端並選擇“人員和組 -> 證書”。
2. 在操作菜單中選擇“導入 Internet 證書”。
3. 使用文件對話框選擇要導入的相關證書文件。導入時可能會要求您提供文件結構,因此請根據需要選擇正確的結構。完成後,它應該出現在視圖中。
4. 打開文件並從操作菜單中選擇“創建交叉證書”。
5. 彈出一個對話框。您選擇證書並點擊確定。
6. 下一個對話框確保您已為您的伺服器正確設置它。IE。正確的伺服器和驗證者。完成後點擊交叉認證。
這應該在視圖中創建一個交叉證書:
此時您需要使用以下命令重新啟動 HTTP 程序。
tell http quit load http