概述
利用 Java 的 JSSE(Java Secure Socket Extension)技術,我們可以方便的編寫安全通訊端程式,關於 JSSE 的介紹,可以參閱 Oracle網站提供的 JSSE指導。程式編寫過程中,我們需要將數位憑證應用到代碼中。通常在正式的產品開發中,我們可以支付一定的費用,向正規認證機構,例如:Verisign、Geotrust、Thawte等申請。
如果只是為了實驗,我們還可以使用 Java 內建的 keytool 工具來製作認證。keytool 是密鑰和認證管理工具,產生的密鑰或認證,存放在 jks(Java Key Store) 格式的檔案裡。從用途上來說,jks 格式的檔案常用於:
1) 儲存非對稱金鑰對以及數位憑證的認證庫;
2) 儲存信任認證列表的信任庫。
注意:不同版本的 Java 內建的 keytool 命令列參數可能會略有不同。相比於 Java6,在 Java7 中 keytool 工具有如下改動:
-export 選項改名為 -exportcert
-genkey 選項改名為 -genkeypair
-import 選項改名為 – importcert
-keyclone 選項被廢棄
-identitydb 選項被廢棄
-selfcert 選項被廢棄
下面將以 Java7 中的 keytool 為例,對常見的用法進行說明。
使用 keytool 製作認證庫以及信任庫
產生非對稱金鑰以及自簽發認證
命令:keytool -genkeypair -alias TEST_ROOT -keystore test_root.jks
解釋:產生一對密鑰以及一個自簽發認證,其中私密金鑰和認證以別名 TEST_ROOT 儲存在 test_root.jks 檔案中。
注意:使用上述命令時,命令列會互動的需要手動填寫密碼、CN、OU 等資訊。
產生認證請求檔案
命令:keytool -certreq -file test_server.csr -alias TEST_SERVER -keystore test_server.jks
解釋:將別名為 TEST_SERVER 的公開金鑰和一些個人資訊從 test_server.jks 檔案中匯出,作為認證請求檔案。
簽發認證
命令:keytool -gencert -infile test_server.csr -outfile test_server.cer -alias TEST_ROOT -keystore TEST_ROOT.jks
解釋:使用別名為 TEST_ROOT 的私密金鑰為 test_server.csr 簽發認證,並儲存到 test_server.cer 檔案中。
從 jks 檔案中匯出認證
命令:keytool -exportcert -alias TEST_ROOT -file test_root.cer -keystore test_root.jks
解釋:從 test_root.jks 檔案中匯出別名為 TEST_ROOT 的認證並存放在 test_root.cer 檔案中。
匯入信任認證到 jks 檔案
命令:keytool -importcert -alias TEST_ROOT -file test_root.cer -keystore TEST_SERVER.jks
解釋:將認證 test_root.cer 以別名 TEST_ROOT 匯入 TEST_SERVER.jks 中。
注意:這裡的目標 jks 檔案裡不含有指定的別名,此時的匯入條目才會以 trustedCertEntry 信任認證的形式儲存。
匯入簽發認證到 jks 檔案 ( 更新認證 )
命令:keytool -importcert -alias TEST_SERVER -file test_server.cer -keystore TEST_SERVER.jks
解釋:將認證 test_server.cer 更新到已存在別名 TEST_SERVER 的 TEST_SERVER.jks 檔案中
注意:這裡的命令和上述匯入信任認證的命令在形式上完全一樣,但作用不同。
1. 這裡的目標 jks 檔案裡要含有指定的別名,這樣 keytool 工具才會理解命令為更新認證,並以 PrivateKeyEntry 的形式儲存。
2. 在更新被簽發認證之前,一定要先將相應的 CA 憑證,匯入進 jks 檔案,否則會報錯“keytool 錯誤 : java.lang.Exception: 無法從回複中建立鏈”。