導(dǎo)出和導(dǎo)入證書
為了解釋清楚如何輸出和輸入證書,我會(huì)使用我自己的 HTTPS 服務(wù)器。這個(gè)服務(wù)器在第一部分中討論過。然后,跟著下面的內(nèi)容開始:
1、運(yùn)行 HTTPS 服務(wù)器,像在第一部分中討論的那樣。
2、運(yùn)行 ReadHttpsURL1:java ReadHttpsURL1 localhost。你同樣會(huì)得到上面所述的異常。
3、使用下面的 keytool 命令導(dǎo)出服務(wù)器證書:
o 從 serverkeys 文件中導(dǎo)出別名為 qusay 的證書
o 將導(dǎo)出的證書保存在 server.cert 文件中,這個(gè)文件會(huì)由 keytool 創(chuàng)建
如你看到的那樣,我根據(jù)要求輸入了密碼。成功輸入密碼之后,服務(wù)器證書被成功的導(dǎo)出并保存在 server.cert 中。
Prompt> keytool -export -keystore serverkeys -alias qusay -file server.cert
Enter keystore password: hellothere
Certificate stored in file
4、將文件 server.cert 拷貝到 ReadHttpsURL1 所在的目錄。使用 keytool 創(chuàng)建一個(gè)新的 keystore 并將服務(wù)器的 server.cert 證書導(dǎo)入其中。這里的命令示例:
Prompt> keytool -import -keystore trustedcerts -alias qusay -file server.cert
這個(gè)命令會(huì)產(chǎn)生下面那樣的輸出。它要求輸入密碼,這是一個(gè)新的密碼,用于 trustedcerts 這個(gè) keystore 的。這個(gè) keystore 由 keytool 創(chuàng)建。在輸出信息的最后,它詢問我是否愿意相信這個(gè)證書,我回答 yes。
Enter keystore password: clientpass
Owner: CN=localhost, OU=Training and Consulting, O=javacourses.com, L=Toronto, ST=Ontario, C=CA
Issuer: CN=localhost, OU=Training and Consulting, O=javacourses.com, L=Toronto, ST=Ontario, C=CA
Serial number: 3dcf988a
Valid from: Mon Nov 11 06:46:18 EST 2002 until: Sun Feb 09 06:46:18 EST 2003
Certificate fingerprints:
MD5: 37:35:4D:3A:2B:7E:B5:09:A5:41:B3:FA:E4:3C:1D:C4
SHA1: CB:7C:77:36:79:A2:37:26:E2:98:61:C2:9D:10:50:69:
99:F9:B9:1B
Trust this certificate? [no]: yes
Certificate was added to keystore
5、現(xiàn)在運(yùn)行 ReadHttpsURL1 并告訴它哪里能找到證書。使用下面的命令:
Prompt> java -Djavax.net.ssl.trustStore=trustedcerts ReadHttpsURL1 localhost
這將會(huì)與你的 HTTPS 服務(wù)器聯(lián)接、校驗(yàn)證書,如果正確,它會(huì)下載默認(rèn)頁面 index.html。
注意:信任管理器負(fù)責(zé)決定遠(yuǎn)端的證書是否值得信任。它使用下面的規(guī)則:
1、如果 javax.net.sll.trustStore 系統(tǒng)屬性指定了信任庫(kù),那么信任管理器會(huì)使用提供的文件來檢查證書。如果那個(gè)系統(tǒng)屬性存在但指定的文件不存在,那么就沒有使用任何信任庫(kù),會(huì)拋出一個(gè) CertificateException 異常。
2、如果 javax.net.sll.trustStore 系統(tǒng)屬性沒有定義,那么它會(huì)去尋找默認(rèn)的信任庫(kù):
如果在你的 java.home 目錄的 lib/security 子目錄下存在名為 jssecacerts 的信任庫(kù),那么使用的就是它。
如果 jssecacerts 不存在,但是 cacerts 存在 (它隨 J2SDK 一起發(fā)行,含有數(shù)量有限的可信任的基本證書),使用的就是 cacerts。
在我的 Windows 2000 客戶機(jī)中,java.home 目錄是 c:\Program File\java\jre1.4.1\lib\security,在上例中,如果你將 trustedcerts 更名為 jssecacerts 并將其移動(dòng)到 lib/security 子目錄中,那么你以后就不需要在命令行指定 javax.net.ssl.trustStore 屬性了。
如果你不知道 java.home 在哪里,這里有一小段代碼可以讓你找到它:
public class FindJavaHome {
public static void main(String argv[]) {
System.out.println(System.getProperty("java.home"));
}
}
|