Java

嘗試訪問 HTTPS URL 時 Domino 9 中的 Java CertificateException

  • June 12, 2013

當我們將 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.URLUrlConnectionHttpsUrlConnectionApache HTTP 客戶端。其中一些是由第 3 方作為 JAR 提供的。我們不能改變所有這些來使用createSocket

有任何想法嗎?謝謝。

因此,對於 Domino 9,隨著新功能 OpenSocial 的添加,圍繞證書更改了許多功能以使其更易於維護。

因此,有一個新的 API “com.ibm.domino.napi.ssl.DominoX509TrustManager”。現在,此 API 所做的是檢查 Domino 證書以獲取相關的受信任證書,該證書也與伺服器證書進行交叉認證。

它首先在 CACERTS 中進行檢查。如果找不到,它將檢查 Domino 證書。

因此,為了使上面的程式碼正常工作,您需要執行以下操作。

  1. 打開 Domino Administrator 客戶端並選擇“人員和組 -> 證書”。

人員和組選項卡,證書視圖 2. 在操作菜單中選擇“導入 Internet 證書”。

菜單設置 3. 使用文件對話框選擇要導入的相關證書文件。導入時可能會要求您提供文件結構,因此請根據需要選擇正確的結構。完成後,它應該出現在視圖中。

查看顯示導入的證書。 4. 打開文件並從操作菜單中選擇“創建交叉證書”。

創建交叉證書的菜單選項 5. 彈出一個對話框。您選擇證書並點擊確定。

交叉證書對話框 6. 下一個對話框確保您已為您的伺服器正確設置它。IE。正確的伺服器和驗證者。完成後點擊交叉認證。

頒發交叉證書對話框

這應該在視圖中創建一個交叉證書:

顯示交叉證書的視圖

此時您需要使用以下命令重新啟動 HTTP 程序。

tell http quit 
load http

引用自:https://serverfault.com/questions/505273