我正在嘗試編寫一個使用javax.mail API發送郵件的SSL客戶端。我遇到的問題是服務器請求使用SSL,但服務器也使用非標準SSL證書進行配置。我發現的網頁說我需要將證書安裝到信任庫中。我不想這樣做(我沒有必要的權限)。是否有可能讓Java忽略「信任存儲」並接受它獲得的任何SSL證書?
- 有沒有辦法讓Java忽略證書錯誤並接受它?
- 失敗的是,有沒有辦法讓信任庫成爲本地的程序,而不是爲整個JVM安裝?
我正在嘗試編寫一個使用javax.mail API發送郵件的SSL客戶端。我遇到的問題是服務器請求使用SSL,但服務器也使用非標準SSL證書進行配置。我發現的網頁說我需要將證書安裝到信任庫中。我不想這樣做(我沒有必要的權限)。是否有可能讓Java忽略「信任存儲」並接受它獲得的任何SSL證書?
您需要創建一個假的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());
試試這個(回答問題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
有沒有一種方法來指定「信任所有」作爲第二個參數在這個像使用*等? – 2012-07-09 07:49:30
@UmerHayat號你必須像其他兩個答案一樣編碼。 – 2012-07-09 11:51:48
工作代碼(在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());
只需將-Dtrust_all_cert=true
添加到VM參數。這個參數告訴java忽略所有的證書檢查。
在CLI
中,您可以將參數-noCertificationCheck
添加到java以忽略證書檢查。
只是爲了澄清,你可以改變服務器代碼,或只是客戶端? – 2009-08-02 16:48:44
忽略證書驗證步驟是一個糟糕的主意。如果你不確定首先是誰,那麼幾乎沒有人會向某人私下交談。選項2(本地信託商店)很容易使用。 – Bruno 2012-01-18 02:24:30
在某些情況下忽略驗證步驟是正確的 - 例如,如果您處於隔離網絡中,並且SSL是唯一啓用的服務,而不是因爲策略,但是因爲您的管理員不知道如何啓用非SSL服務。 – vy32 2012-01-19 03:10:23