2009-08-02 35 views
17

我正在嘗試編寫一個使用javax.mail API發送郵件的SSL客戶端。我遇到的問題是服務器請求使用SSL,但服務器也使用非標準SSL證書進行配置。我發現的網頁說我需要將證書安裝到信任庫中。我不想這樣做(我沒有必要的權限)。是否有可能讓Java忽略「信任存儲」並接受它獲得的任何SSL證書?

  1. 有沒有辦法讓Java忽略證書錯誤並接受它?
  2. 失敗的是,有沒有辦法讓信任庫成爲本地的程序,而不是爲整個JVM安裝?
+0

只是爲了澄清,你可以改變服務器代碼,或只是客戶端? – 2009-08-02 16:48:44

+0

忽略證書驗證步驟是一個糟糕的主意。如果你不確定首先是誰,那麼幾乎沒有人會向某人私下交談。選項2(本地信託商店)很容易使用。 – Bruno 2012-01-18 02:24:30

+1

在某些情況下忽略驗證步驟是正確的 - 例如,如果您處於隔離網絡中,並且SSL是唯一啓用的服務,而不是因爲策略,但是因爲您的管理員不知道如何啓用非SSL服務。 – vy32 2012-01-19 03:10:23

回答

16

您需要創建一個假的TrustManager接受所有證書,並將其註冊爲 經理。例如:

public class MyManager implements com.sun.net.ssl.X509TrustManager { 
    public boolean isClientTrusted(X509Certificate[] chain) { return true; } 
    public boolean isHostTrusted(X509Certificate[] chain) { return true; } 
    ... 
} 


com.sun.net.ssl.TrustManager[] managers = 
    new com.sun.net.ssl.TrustManager[] {new MyManager()}; 

com.sun.net.ssl.SSLContext.getInstance("SSL"). 
     .init(null, managers, new SecureRandom()); 
6

試試這個(回答問題2):

System.setProperty("javax.net.ssl.trustStore", "/path/to/truststore"); 

你也可以指定這個作爲一個額外的命令行參數:

java -Djavax.net.ssl.trustStore=/path/to/truststore <remaining arguments> 

在Fedora這可能是系統範圍內的Java信任商店/etc/pki/java/cacerts

+1

有沒有一種方法來指定「信任所有」作爲第二個參數在這個像使用*等? – 2012-07-09 07:49:30

+0

@UmerHayat號你必須像其他兩個答案一樣編碼。 – 2012-07-09 11:51:48

21

工作代碼(在jdk1.6.0_23中)#1。

進口

import javax.net.ssl.HttpsURLConnection; 
import javax.net.ssl.SSLContext; 
import javax.net.ssl.TrustManager; 
import javax.net.ssl.X509TrustManager; 
import java.security.cert.X509Certificate; 

實際信任所有的TrustManager代碼。

TrustManager trm = new X509TrustManager() { 
    public X509Certificate[] getAcceptedIssuers() { 
     return null; 
    } 

    public void checkClientTrusted(X509Certificate[] certs, String authType) { 

    } 

    public void checkServerTrusted(X509Certificate[] certs, String authType) { 
    } 
}; 

SSLContext sc = SSLContext.getInstance("SSL"); 
sc.init(null, new TrustManager[] { trm }, null); 
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); 
1

只需將-Dtrust_all_cert=true添加到VM參數。這個參數告訴java忽略所有的證書檢查。

-2

CLI中,您可以將參數-noCertificationCheck添加到java以忽略證書檢查。