SSL:用Keytool生成和簽發數字證書
參考:
證書是用java keytool生成的,如下:
1.生成服務端證書
假定目標機器的域名是“10.10.20.35”。
如果Tomcat所在伺服器的域名不是“10.10.20.35”,應改為對應的域名,如“www.sina.com.cn”,否則瀏覽器會彈出警告視窗,提示使用者證書與所在域不匹配。在本地做開發測試時,應填入“localhost”。
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 生成過程設定的密碼。
5.把客戶端證書加入服務端證書信任列表
通過以上命令,客戶端證書就被我們匯出到client.cer檔案了。下一步,是將該檔案匯入到伺服器的證書庫,新增為一個信任證書:
通過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可以是任意值。
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",使用如下命令生成:
- 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,024 位 RSA 金鑰對和自簽名證書 (SHA1withRSA)(有效期為 90 天):
- CN=localhost, OU=hansky, O=cr, ST=bj, C=zh_cn
- [正在儲存 e:\keytool\tomcat.keystore]
如果Tomcat所在伺服器的域名不是"localhost",應改為對應的域名,如"www.sina.com.cn",否則瀏覽器會彈出警告視窗,提示使用者證書與所在域不匹配。在本地做開發測試時,應填入"localhost"。
2. 生成客戶端證書
為瀏覽器生成證書,以便讓伺服器來驗證它。為了能將證書順利匯入至IE和Firefox,證書格式應該是PKCS12,因此,使用如下命令生成:
Java程式碼
- 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,024 位 RSA 金鑰對和自簽名證書 (SHA1withRSA)(有效期為 90 天):
- CN=lcl, OU=lc, O=r, L=bj, ST=bj, C=zh_cn
- [正在儲存 e:\keytool\lcl.p12]
對應的證書庫存放在"e:\keytool\lcl.p12",客戶端的CN可以是任意值。稍候,我們將把這個"my.p12"證書庫匯入到IE和Firefox中。
3. 讓伺服器信任客戶端證書
由於是雙向SSL認證,伺服器必須要信任客戶端證書,因此,必須把客戶端證書新增為伺服器的信任認證。由於不能直接將PKCS12格式的證書庫匯入,我們必須先把客戶端證書匯出為一個單獨的CER檔案,使用如下命令:
Java程式碼
- keytool -exportcert -alias lcl -keystore e:\keytool\lcl.p12 -storetype PKCS12 -storepass aaaaaaa -rfc -file e:\keytool\lcr.cer
- 儲存在檔案中的認證 <e:\keytool\lcr.cer>
通過以上命令,客戶端證書就被我們匯出到"e:\keytool\lcr.cer"檔案了。下一步,是將該檔案匯入到伺服器的證書庫,新增為一個信任證書:
Java程式碼
- keytool -importcert -v -file e:\keytool\lcr.cer -keystore e:\keytool\tomcat.keystore -storepass aaaaaaa
- 所有者:CN=lcl, OU=lc, O=r, L=bj, ST=bj, C=zh_cn
- 簽發人:CN=lcl, OU=lc, O=r, L=bj, ST=bj, C=zh_cn
- 序列號:4cd90399
- 有效期: Tue Nov 09 16:17:29 CST 2010 至Mon Feb 07 16:17:29 CST 2011
- 證書指紋:
- MD5:A4:BB:D1:E6:35:60:22:CC:DC:EF:6E:D9:B0:5C:2C:C7
- SHA1:12:90:4B:7A:C0:D8:EB:CC:7B:A7:15:8A:05:46:AC:F7:AE:BF:0E:62
- 簽名演算法名稱:SHA1withRSA
- 版本: 3
- 信任這個認證? [否]: y
- 認證已新增至keystore中
- [正在儲存 e:\keytool\tomcat.keystore]
通過list 命令檢視伺服器的證書庫,我們可以看到兩個輸入,一個是伺服器證書,一個是受信任的客戶端證書:
Java程式碼
- 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程式碼
- <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
- maxThreads="150" scheme="https" secure="true"
- clientAuth="true" sslProtocol="TLS"
- keystoreFile="tomcat.keystore" keystorePass="aaaaaaa"
- 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. 測試
測試程式碼
- https://localhost:8443/