準備工作
(1)檢查JDK的環境變量是否正確。本文使用JDK 1.6
(2)準備web服務器,這裏選用TOMCAT 6.0
(3)準備web service服務端和客戶端。
生成證書
這裏用到的文件,這裏存放在D:/SSL/文件夾內,其中D:/SSL/server/內的文件是要交給服務器用的,D:/SSL/client/內的文件是要交給客戶端用的。
1生成服務端證書
開始-運行-CMD-在dos窗口執行下執行命令:
keytool -genkey -v -aliastomcat -keyalg RSA -keystore D:/SSL/server/tomcat.keystore -dname"CN=127.0.0.1,OU=zlj,O=zlj,L=Peking,ST=Peking,C=CN" -validity 3650-storepass zljzlj -keypass zljzlj
說明:
keytool 是JDK提供的證書生成工具,所有參數的用法參見keytool –help
-genkey 創建新證書
-v 詳細信息
-alias tomcat 以”tomcat”作為該證書的別名。這裏可以根據需要修改
-keyalg RSA 指定算法
-keystoreD:/SSL/server/tomcat.keystore 保存路徑及文件名
-dname"CN=127.0.0.1,OU=zlj,O=zlj,L=Peking,ST=Peking,C=CN" 證書發行者身份,這裏的CN要與發布後的訪問域名壹致。但由於這裏是自簽證書,如果在瀏覽器訪問,仍然會有警告提示。真正場景中建議申請CA機構(wosign)簽發的SSL證書更安全。
-validity 3650證書有效期,單位為天
-storepass zljzlj 證書的存取密碼
-keypass zljzlj 證書的私鑰
2 生成客戶端證書
執行命令:
keytool ‐genkey ‐v ‐aliasclient ‐keyalg RSA ‐storetype PKCS12 ‐keystore D:/SSL/client/client.p12 ‐dname"CN=client,OU=zlj,O=zlj,L=bj,ST=bj,C=CN" ‐validity 3650 ‐storepassclient ‐keypass client
說明:
參數說明同上。這裏的-dname 證書發行者身份可以和前面不同,到目前為止,這2個證書可以沒有任何關系。下面要做的工作才是建立2者之間的信任關系。
3 導出客戶端證書
執行命令:
keytool ‐export ‐aliasclient ‐keystore D:/SSL/client/client.p12 ‐storetype PKCS12 ‐storepass client‐rfc ‐file D:/SSL/client/client.cer
說明:
-export 執行導出
-file 導出文件的文件路徑
4 把客戶端證書加入服務端證書信任列表
執行命令:
keytool ‐import ‐aliasclient ‐v ‐file D:/SSL/client/client.cer ‐keystoreD:/SSL/server/tomcat.keystore ‐storepass zljzl
說明:
參數說明同前。這裏提供的密碼是服務端證書的存取密碼。
5 導出服務端證書
執行命令:
keytool -export -aliastomcat -keystore D:/SSL/server/tomcat.keystore -storepass zljzlj -rfc -fileD:/SSL/server/tomcat.cer
說明:
把服務端證書導出。這裏提供的密碼也是服務端證書的密碼。
6 生成客戶端信任列表
執行命令:
keytool -import -fileD:/SSL/server/tomcat.cer -storepass zljzlj -keystoreD:/SSL/client/client.truststore -alias tomcat –noprompt
說明:
讓客戶端信任服務端證書
配置服務端為只允許HTTPS連接
1 配置Tomcat 目錄下的/conf/server.xml
Xml代碼:
<Connectorport="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="e-file-list>之後增加Xml代碼:
<!-- 強制SSL配置,即普通的請求也會重定向為SSL請求 -->
<security-constraint>
<web-resource-collection>
<web-resource-name>SSL</web-resource-name>
<url-pattern>/service/*</url-pattern><!--全站使用SSL <url-pattern>/*</url-pattern>-->
</web-resource-collection>
<user-data-constraint>
<description>SSL required</description>
<!-- CONFIDENTIAL: 要保證服務器和客戶端之間傳輸的數據不能夠被修改,且不能被第三方查看到 -->
<!-- INTEGRAL: 要保證服務器和client之間傳輸的數據不能夠被修改 -->
<!-- NONE: 指示容器必須能夠在任壹的連接上提供數據。(即用HTTP或HTTPS,由客戶端來決定)-->
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
說明:
這裏限制了WEB service服務地址的訪問必須為.ssl.trustStore","D:/SSL/client/client.truststore");
System.setProperty("javax.net.ssl.trustStorePassword","zljzlj");
System.setProperty("javax.net.ssl.keyStoreType","PKCS12");
System.setProperty("javax.net.ssl.keyStore","D:/SSL/client/client.p12");
System.setProperty("javax.net.ssl.keyStorePassword","client");
StringendPoint="https://127.0.0.1:8443/easbCut/services/ApplyFormService";
...
通過設置參數來指定客戶端連接時所使用的客戶端證書,這裏還可以采用修改JVM啟動參數的的方式來執行,但出於不影響其他功能的考慮,這裏采用System.setProperty的方式來設置這些參數,在使用結束後,可以還原這些參數配置。做為客戶端的開發者,可以把拿到的證書文件後,只執行步驟3。