1. 程式人生 > >SSL:用Keytool生成和簽發數字證書

SSL:用Keytool生成和簽發數字證書

伺服器端需要設定javax.net.ssl.keyStore/javax.net.ssl.keyStorePassword兩個系統引數

而客戶端需要設定javax.net.ssl.trustStore/javax.net.ssl.trustStorePassword兩個系統引數

參考:

證書是用java keytool生成的,如下:

1.生成服務端證書

假定目標機器的域名是“10.10.20.35”。

如果Tomcat所在伺服器的域名不是“10.10.20.35”,應改為對應的域名,如“www.sina.com.cn”,否則瀏覽器會彈出警告視窗,提示使用者證書與所在域不匹配。在本地做開發測試時,應填入“localhost”。

keytool -genkey -v -alias server -keyalg RSA -keystore C:/Users/zcy/Desktop/ssl/server.keystore -dname "CN=10.10.20.35,OU=Tongtech,O=Tongtech,L=SiChuan,ST=SiChuan,C=CN" -validity 3650 -storepass 123456 -keypass 123456

2.匯出服務端證書
keytool -export -alias server -keystore C:/Users/zcy/Desktop/ssl/server.keystore -storepass 123456 -rfc -file C:/Users/zcy/Desktop/ssl/server.cer

3.生成客戶端證書
keytool -genkey -v -alias client -keyalg RSA -keystore C:/Users/zcy/Desktop/ssl/client.keystore -dname "CN=client,OU=Tongtech,O=Tongtech,L=SiChuan,ST=SiChuan,C=CN" -validity 3650 -storepass 123456 -keypass 123456

4.匯出客戶端證書

由於是雙向SSL認證,伺服器必須要信任客戶端證書,因此,必須把客戶端證書新增為伺服器的信任認證。由於不能直接將PKCS12格式的證書庫匯入,我們必須先把客戶端證書匯出為一個單獨的CER檔案。

其中storepass 為client.keystore 生成過程設定的密碼。

keytool -export -alias client -keystore C:/Users/zcy/Desktop/ssl/client.keystore -storepass 123456 -rfc -file C:/Users/zcy/Desktop/ssl/client.cer

5.把客戶端證書加入服務端證書信任列表

通過以上命令,客戶端證書就被我們匯出到client.cer檔案了。下一步,是將該檔案匯入到伺服器的證書庫,新增為一個信任證書:

keytool -import -file C:/Users/zcy/Desktop/ssl/client.cer -storepass 123456 -keystore C:/Users/zcy/Desktop/ssl/server.truststore -alias client

通過list命令檢視伺服器的證書庫,我們可以看到兩個輸入,一個是伺服器證書,一個是受信任的客戶端證書:
keytool -list -keystore server.truststore


6.生成客戶端信任列表 (客戶端信任的服務端)
keytool -import -file C:/Users/zcy/Desktop/ssl/server.cer -storepass 123456 -keystore C:/Users/zcy/Desktop/ssl/client.truststore -alias server




1.瀏覽器證書(已可正常訪問)

瀏覽器生成證書,以便讓伺服器來驗證它。為了能將證書順利匯入至IE和Firefox,證書格式應該是PKCS12。

客戶端的CN可以是任意值。

keytool -validity 365 -genkeypair -v -alias browser -keyalg RSA -storetype PKCS12 -keystore C:/Users/zcy/Desktop/ssl/browser.p12 -dname "CN=browser,OU=Tongtech,O=Tongtech,L=SiChuan,ST=SiChuan,c=cn" -storepass 123456 -keypass 123456

2、從客戶端證書庫中匯出客戶端證書
keytool -export -v -alias browser -keystore C:/Users/zcy/Desktop/ssl/browser.p12 -storetype PKCS12 -storepass 123456 -rfc -file C:/Users/zcy/Desktop/ssl/browser.cer

3、將客戶端證書匯入到伺服器證書庫(使得伺服器信任客戶端證書)
keytool -import -v -alias browser -file C:/Users/zcy/Desktop/ssl/browser.cer -keystore C:/Users/zcy/Desktop/ssl/server.truststore -storepass 123456

keytool -list -keystore C:/Users/zcy/Desktop/ssl/server.truststore -storepass 123456

###################################################################

證書儲存在伺服器端,使用者通過瀏覽器訪問時,需要將證書下載儲存到本地,表示信任伺服器。同樣瀏覽器中的證書也需要儲存到伺服器的證書庫中,表明當前瀏覽器的證書是可信的。
        環境:tomcat-6.0.18、jdk1.6.0_18 
1. 為伺服器生成證書
        使用keytool為Tomcat生成證書,假定目標機器的域名是"localhost",keystore 檔案存放在"e:\keytool\tomcat.keystore",口令為"aaaaaaa",使用如下命令生成: 

Java程式碼  收藏程式碼
  1. keytool -genkeypair -v -alias tomcat -keyalg RSA -keystore e:\keytool\tomcat.keystore -dname "CN=localhost,OU=hansky,O=cr,ST=bj,C=zh_cn" -storepass aaaaaaa -keypass aaaaaaa  
生成證書提示程式碼  收藏程式碼
  1. 正在為以下物件生成 1,024 位 RSA 金鑰對和自簽名證書 (SHA1withRSA)(有效期為 90 天):  
  2. CN=localhost, OU=hansky, O=cr, ST=bj, C=zh_cn  
  3. [正在儲存 e:\keytool\tomcat.keystore]  

        如果Tomcat所在伺服器的域名不是"localhost",應改為對應的域名,如"www.sina.com.cn",否則瀏覽器會彈出警告視窗,提示使用者證書與所在域不匹配。在本地做開發測試時,應填入"localhost"。 
2. 生成客戶端證書
        為瀏覽器生成證書,以便讓伺服器來驗證它。為了能將證書順利匯入至IE和Firefox,證書格式應該是PKCS12,因此,使用如下命令生成: 
Java程式碼  收藏程式碼
  1. keytool -genkeypair -v -alias lcl -keyalg RSA -storetype PKCS12 -keystore e:\keytool\lcl.p12 -dname "CN=lcl,OU=lc,O=r,L=bj,ST=bj,C=zh_cn" -storepass aaaaaaa -keypass aaaaaaa  
生成證書提示程式碼  收藏程式碼
  1. 正在為以下物件生成 1,024 位 RSA 金鑰對和自簽名證書 (SHA1withRSA)(有效期為 90 天):  
  2.     CN=lcl, OU=lc, O=r, L=bj, ST=bj, C=zh_cn  
  3. [正在儲存 e:\keytool\lcl.p12]  

        對應的證書庫存放在"e:\keytool\lcl.p12",客戶端的CN可以是任意值。稍候,我們將把這個"my.p12"證書庫匯入到IE和Firefox中。 
3. 讓伺服器信任客戶端證書
        由於是雙向SSL認證,伺服器必須要信任客戶端證書,因此,必須把客戶端證書新增為伺服器的信任認證。由於不能直接將PKCS12格式的證書庫匯入,我們必須先把客戶端證書匯出為一個單獨的CER檔案,使用如下命令: 
Java程式碼  收藏程式碼
  1. keytool -exportcert -alias lcl -keystore e:\keytool\lcl.p12 -storetype PKCS12 -storepass aaaaaaa -rfc -file e:\keytool\lcr.cer  
匯出證書程式碼  收藏程式碼
  1. 儲存在檔案中的認證 <e:\keytool\lcr.cer>  

        通過以上命令,客戶端證書就被我們匯出到"e:\keytool\lcr.cer"檔案了。下一步,是將該檔案匯入到伺服器的證書庫,新增為一個信任證書: 
Java程式碼  收藏程式碼
  1. keytool -importcert -v -file e:\keytool\lcr.cer -keystore e:\keytool\tomcat.keystore -storepass aaaaaaa  
匯入證書的提示程式碼  收藏程式碼
  1. 所有者:CN=lcl, OU=lc, O=r, L=bj, ST=bj, C=zh_cn  
  2. 簽發人:CN=lcl, OU=lc, O=r, L=bj, ST=bj, C=zh_cn  
  3. 序列號:4cd90399  
  4. 有效期: Tue Nov 09 16:17:29 CST 2010 至Mon Feb 07 16:17:29 CST 2011  
  5. 證書指紋:  
  6.          MD5:A4:BB:D1:E6:35:60:22:CC:DC:EF:6E:D9:B0:5C:2C:C7  
  7.          SHA1:12:90:4B:7A:C0:D8:EB:CC:7B:A7:15:8A:05:46:AC:F7:AE:BF:0E:62  
  8.          簽名演算法名稱:SHA1withRSA  
  9.          版本: 3  
  10. 信任這個認證? [否]:  y  
  11. 認證已新增至keystore中  
  12. [正在儲存 e:\keytool\tomcat.keystore]  

        通過list 命令檢視伺服器的證書庫,我們可以看到兩個輸入,一個是伺服器證書,一個是受信任的客戶端證書: 
Java程式碼  收藏程式碼
  1. keytool -list -v -keystore e:\keytool\tomcat.keystore -storepass aaaaaaa  

4. 將e:\keytool\tomcat.keystore拷貝到tomcat的根目錄下,我拷貝到c:\tomcat(這是我的tomcat安裝目錄)下
        5. 配置tomcat 
        開啟Tomcat根目錄下的/conf/server.xml,找到如下配置段,修改如下: 
Server.xml程式碼  收藏程式碼
  1. <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"  
  2.            maxThreads="150" scheme="https" secure="true"                
  3.            clientAuth="true" sslProtocol="TLS"  
  4.            keystoreFile="tomcat.keystore" keystorePass="aaaaaaa"  
  5.            truststoreFile="tomcat.keystore" truststorePass="aaaaaaa"/>  

        其中,clientAuth 指定是否需要驗證客戶端證書,如果該設定為"false",則為單向SSL驗證,SSL 配置可到此結束。如果clientAuth設定為"true",表示強制雙向SSL驗證,必須驗證客戶端證書。如果clientAuth設定為"want",則表示可以驗證客戶端證書,但如果客戶端沒有有效證書,也不強制驗證。 
6. 匯入客戶端證書
        如果設定了clientAuth="true",則需要強制驗證客戶端證書。雙擊"e:\keytool\lcl.p12"即可將證書匯入至IE,匯入證書後,即可啟動Tomcat,用IE 進行訪問。如果需要用FireFox 訪問,則需將證書匯入至FireFox。 
7. 測試
測試程式碼  收藏程式碼
  1. https://localhost:8443/