在JSSE中篓像,證書(shū)信任管理器類就是實(shí)現(xiàn)了接口X509TrustManager的類动知。我們可以自己實(shí)現(xiàn)該接口,讓它信任我們指定的證書(shū)员辩。
接口X509TrustManager有下述三個(gè)公有的方法需要我們實(shí)現(xiàn):
⑴ oid checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException
該方法檢查客戶端的證書(shū)盒粮,若不信任該證書(shū)則拋出異常。由于我們不需要對(duì)客戶端進(jìn)行認(rèn)證奠滑,因此我們只需要執(zhí)行默認(rèn)的信任管理器的這個(gè)方法丹皱。JSSE中妒穴,默認(rèn)的信任管理器類為T(mén)rustManager。
⑵ oid checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException
該方法檢查服務(wù)器的證書(shū)种呐,若不信任該證書(shū)同樣拋出異常宰翅。通過(guò)自己實(shí)現(xiàn)該方法,可以使之信任我們指定的任何證書(shū)爽室。在實(shí)現(xiàn)該方法時(shí)汁讼,也可以簡(jiǎn)單的不做任何處理,即一個(gè)空的函數(shù)體阔墩,由于不會(huì)拋出異常嘿架,它就會(huì)信任任何證書(shū)。
⑶ X509Certificate[] getAcceptedIssuers()
返回受信任的X509證書(shū)數(shù)組啸箫。
自己實(shí)現(xiàn)了信任管理器類耸彪,如何使用呢?類HttpsURLConnection似乎并沒(méi)有提供方法設(shè)置信任管理器忘苛。其實(shí)蝉娜,HttpsURLConnection通過(guò)SSLSocket來(lái)建立與HTTPS的安全連接,SSLSocket對(duì)象是由SSLSocketFactory生成的扎唾。HttpsURLConnection提供了方法setSSLSocketFactory(SSLSocketFactory)設(shè)置它使用的SSLSocketFactory對(duì)象召川。SSLSocketFactory通過(guò)SSLContext對(duì)象來(lái)獲得,在初始化SSLContext對(duì)象時(shí)胸遇,可指定信任管理器對(duì)象荧呐。下面用一個(gè)圖簡(jiǎn)單表示這幾個(gè)JSSE類的關(guān)系:
圖1 部分JSSE類的關(guān)系圖
假設(shè)自己實(shí)現(xiàn)的X509TrustManager類的類名為:MyX509TrustManager,下面的代碼片斷說(shuō)明了如何使用MyX509TrustManager:
//創(chuàng)建SSLContext對(duì)象纸镊,并使用我們指定的信任管理器初始化
TrustManager[] tm = {new MyX509TrustManager ()};
SSLContext sslContext = SSLContext.getInstance("SSL","SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom());
//從上述SSLContext對(duì)象中得到SSLSocketFactory對(duì)象
SSLSocketFactory ssf = sslContext.getSocketFactory();
//創(chuàng)建HttpsURLConnection對(duì)象倍阐,并設(shè)置其SSLSocketFactory對(duì)象
HttpsURLConnection httpsConn = (HttpsURLConnection)myURL.openConnection();
httpsConn.setSSLSocketFactory(ssf);
這樣,HttpsURLConnection對(duì)象就可以正常連接HTTPS了逗威,無(wú)論其證書(shū)是否經(jīng)權(quán)威機(jī)構(gòu)的驗(yàn)證峰搪,只要實(shí)現(xiàn)了接口X509TrustManager的類MyX509TrustManager信任該證書(shū)。