2011-05-02 54 views
1

我嘗試使用來自Java應用程序的HTTP訪問網站。由於應用程序在開發環境中運行,因此相應的證書不受信任。使用HTTPS(不可信證書)使用Java訪問網站時出現問題

當使用javax.net.ssl包時,我嘗試定義一個自定義的TrustManager實現,該實現允許將所有內容傳遞給SslContext的init方法的第二個參數,但這不起作用。

有沒有人做過類似的工作? 非常感謝您的幫助! Thierry

+2

任何示例代碼? – Manny 2011-05-02 08:04:37

+0

您是否使用-Djavax.net.debug = all(或auth)來查看發生了什麼?你是如何使用新創建的上下文的?而且 - 當然 - 因爲證書應該是公開的,爲什麼不相信證書呢? – 2011-05-02 08:28:06

+0

非常感謝您的回答!在使用調試提示時,我可以看到:SEND TLSv1 ALERT:fatal,description = certificate_unknow。事實上,我可以信任證書,因爲它是來自第三方公司的開發服務器。 – 2011-05-02 08:46:37

回答

0

如果您信任該證書,則應將其添加到您的應用程序服務器的信任庫中。實施不執行證書檢查的信任管理器是一個安全漏洞。

+0

你好,非常感謝你的幫助。是的,我同意你的觀點!它只適用於開發環境... – 2011-05-03 17:04:00

1

這是很容易實現TrustManager不驗證什麼(工作在客戶端和服務器端):

public class NoVerifyTM implements X509TrustManager 
{ 
    void checkClientTrusted(X509Certificate[] chain, String authType) { 
    /* Accept All */ 
    } 

    void checkServerTrusted(X509Certificate[] chain, String authType) { 
    /* Accept All */ 
    } 

    X509Certificate[] getAcceptedIssuers() { 
    return new X509Certificate[0] 
    } 
} 

要使用此TrustManager

SSLContext ctx = SSLContext.getDefault(); 
ctx.init(null, new TrustManager[] { new NoVerifyTM() }, null); 
SSLSocketFactory sf = ctx.getSocketFactory(); 

請注意:(如@hanwg所說),這種信任管理器只能用於測試/原型設計。

+0

你好,非常感謝你的回答。不幸的是,這並不能解決我的問題......事實上,我認爲還有更多事情要做。也許在關鍵經理層面? – 2011-05-03 17:03:20

+0

你可以給我們一些你寫的代碼片段,或者你得到的例外嗎?這將是更容易幫助:) – Jcs 2011-05-03 17:05:37