導出和導入證書
為了解釋清楚如何輸出和輸入證書,我會使用我自己的 HTTPS 服務器。這個服務器在第一部分中討論過。然后,跟著下面的內容開始:
1、運行 HTTPS 服務器,像在第一部分中討論的那樣。
2、運行 ReadHttpsURL1:java ReadHttpsURL1 localhost。你同樣會得到上面所述的異常。
3、使用下面的 keytool 命令導出服務器證書:
o 從 serverkeys 文件中導出別名為 qusay 的證書
o 將導出的證書保存在 server.cert 文件中,這個文件會由 keytool 創建
如你看到的那樣,我根據要求輸入了密碼。成功輸入密碼之后,服務器證書被成功的導出并保存在 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 創建一個新的 keystore 并將服務器的 server.cert 證書導入其中。這里的命令示例:
Prompt> keytool -import -keystore trustedcerts -alias qusay -file server.cert
這個命令會產生下面那樣的輸出。它要求輸入密碼,這是一個新的密碼,用于 trustedcerts 這個 keystore 的。這個 keystore 由 keytool 創建。在輸出信息的最后,它詢問我是否愿意相信這個證書,我回答 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、現在運行 ReadHttpsURL1 并告訴它哪里能找到證書。使用下面的命令:
Prompt> java -Djavax.net.ssl.trustStore=trustedcerts ReadHttpsURL1 localhost
這將會與你的 HTTPS 服務器聯接、校驗證書,如果正確,它會下載默認頁面 index.html。
注意:信任管理器負責決定遠端的證書是否值得信任。它使用下面的規則:
1、如果 javax.net.sll.trustStore 系統屬性指定了信任庫,那么信任管理器會使用提供的文件來檢查證書。如果那個系統屬性存在但指定的文件不存在,那么就沒有使用任何信任庫,會拋出一個 CertificateException 異常。
2、如果 javax.net.sll.trustStore 系統屬性沒有定義,那么它會去尋找默認的信任庫:
如果在你的 java.home 目錄的 lib/security 子目錄下存在名為 jssecacerts 的信任庫,那么使用的就是它。
如果 jssecacerts 不存在,但是 cacerts 存在 (它隨 J2SDK 一起發行,含有數量有限的可信任的基本證書),使用的就是 cacerts。
在我的 Windows 2000 客戶機中,java.home 目錄是 c:\Program File\java\jre1.4.1\lib\security,在上例中,如果你將 trustedcerts 更名為 jssecacerts 并將其移動到 lib/security 子目錄中,那么你以后就不需要在命令行指定 javax.net.ssl.trustStore 屬性了。
如果你不知道 java.home 在哪里,這里有一小段代碼可以讓你找到它:
public class FindJavaHome {
public static void main(String argv[]) {
System.out.println(System.getProperty("java.home"));
}
}
|