在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信任該證書。