1. 程式人生 > >X509證書信任管理器類的詳解

X509證書信任管理器類的詳解

在JSSE中,證書信任管理器類就是實現了介面X509TrustManager的類。我們可以自己實現該介面,讓它信任我們指定的證書。

  介面X509TrustManager有下述三個公有的方法需要我們實現:

  ⑴ oid checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException

  該方法檢查客戶端的證書,若不信任該證書則丟擲異常。由於我們不需要對客戶端進行認證,因此我們只需要執行預設的信任管理器的這個方法。JSSE中,預設的信任管理器類為TrustManager。

  ⑵ oid checkServerTrusted(X509Certificate[] chain, String authType)

throws CertificateException

  該方法檢查伺服器的證書,若不信任該證書同樣丟擲異常。通過自己實現該方法,可以使之信任我們指定的任何證書。在實現該方法時,也可以簡單的不做任何處理,即一個空的函式體,由於不會丟擲異常,它就會信任任何證書。

  ⑶ X509Certificate[] getAcceptedIssuers()

  返回受信任的X509證書陣列。

  自己實現了信任管理器類,如何使用呢?類HttpsURLConnection似乎並沒有提供方法設定信任管理器。其實,HttpsURLConnection通過SSLSocket來建立與HTTPS的安全連線,SSLSocket物件是由SSLSocketFactory生成的。HttpsURLConnection提供了方法setSSLSocketFactory(SSLSocketFactory)設定它使用的SSLSocketFactory物件。SSLSocketFactory通過SSLContext物件來獲得,在初始化SSLContext物件時,可指定信任管理器物件。下面用一個圖簡單表示這幾個JSSE類的關係:



圖1 部分JSSE類的關係圖
  假設自己實現的X509TrustManager類的類名為:MyX509TrustManager,下面的程式碼片斷說明了如何使用MyX509TrustManager:

//建立SSLContext物件,並使用我們指定的信任管理器初始化
TrustManager[] tm = {new MyX509TrustManager ()};
SSLContext sslContext = SSLContext.getInstance("SSL","SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom());

//從上述SSLContext物件中得到SSLSocketFactory物件

SSLSocketFactory ssf = sslContext.getSocketFactory();

//建立HttpsURLConnection物件,並設定其SSLSocketFactory物件
HttpsURLConnection httpsConn = (HttpsURLConnection)myURL.openConnection();
httpsConn.setSSLSocketFactory(ssf);

  這樣,HttpsURLConnection物件就可以正常連線HTTPS了,無論其證書是否經權威機構的驗證,只要實現了介面X509TrustManager的類MyX509TrustManager信任該證書。

  小結

  本文主要介紹了在HTTPS的證書未經權威機構認證的情況下,訪問HTTPS站點的兩種方法,一種方法是把該證書匯入到Java的TrustStore檔案中,另一種是自己實現並覆蓋JSSE預設的證書信任管理器類。兩種方法各有優缺點,第一種方法不會影響JSSE的安全性,但需要手工匯入證書;第二種方法雖然不用手工匯入證書,但需要小心使用,否則會帶來一些安全隱患。