1. 程式人生 > >如何通過HTTPS(SSL加密)方式訪問web service

如何通過HTTPS(SSL加密)方式訪問web service

web service在企業應用中常常被用作不同系統之間的介面方式。但是如果沒有任何安全機制的話,顯然是難以委以重任的。比較直接的web service加密方式就是使用https方式(SSL)方式加密連線,並且只允許持有信任證書的客戶端連線,即SSL雙向認證。這樣就保證了連線來源的可信度以及資料在傳輸過程中沒有被竊取或篡改。而且我認為這樣做的開發量最小。具體方法如下
本文適合對SSL加密方式不是很瞭解的朋友們閱讀,如果你是這方面的專家,我描述的步驟就顯得太羅嗦了。
0. 準備工作及環境說明
0.1 檢查JDK的環境變數是否正確(略)。我使用的是JDK 1.6
0.2 準備web伺服器,這裡選用TOMCAT 6.0
0.3 準備web service服務端和客戶端(略,如果不會寫的話可以用eclipse的工具生成)。
1. 生成證書
這裡用到的檔案,我們存放在D:/SSL/資料夾內,其中D:/SSL/server/內的檔案是要交給伺服器用的,D:/SSL/client/內的檔案是要交給客戶端用的。
1.1生成服務端證書
開始-執行-CMD-在dos視窗執行下執行命令:
keytool -genkey -v -alias tomcat -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 指定演算法
-keystore D:/SSL/server/tomcat.keystore 儲存路徑及檔名
-dname "CN=127.0.0.1,OU=zlj,O=zlj,L=Peking,ST=Peking,C=CN" 證書發行者身份,這裡的CN要與釋出後的訪問域名一致。但由於我們是自己發行的證書,如果在瀏覽器訪問,仍然會有警告提示。
-validity 3650證書有效期,單位為天
-storepass zljzlj 證書的存取密碼
-keypass zljzlj 證書的私鑰
1.2 生成客戶端證書
執行命令:
keytool ‐genkey ‐v ‐alias client ‐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 ‐storepass client ‐keypass client
說明:
引數說明同上。這裡的-dname 證書發行者身份可以和前面不同,到目前為止,這2個證書可以沒有任何關係。下面要做的工作才是建立2者之間的信任關係。
1.3 匯出客戶端證書
執行命令:
keytool ‐export ‐alias client ‐keystore D:/SSL/client/client.p12 ‐storetype PKCS12 ‐storepass client ‐rfc ‐file D:/SSL/client/client.cer
說明:
-export 執行匯出
-file 匯出檔案的檔案路徑
1.4 把客戶端證書加入服務端證書信任列表
執行命令:
keytool ‐import ‐alias client ‐v ‐file D:/SSL/client/client.cer ‐keystore D:/SSL/server/tomcat.keystore ‐storepass zljzl
說明:
引數說明同前。這裡提供的密碼是服務端證書的存取密碼。
1.5 匯出服務端證書
執行命令:
keytool -export -alias tomcat -keystore D:/SSL/server/tomcat.keystore -storepass zljzlj -rfc -file D:/SSL/server/tomcat.cer
說明:
把服務端證書匯出。這裡提供的密碼也是服務端證書的密碼。
1.6 生成客戶端信任列表
執行命令:
keytool -import -file D:/SSL/server/tomcat.cer -storepass zljzlj -keystore D:/SSL/client/client.truststore -alias tomcat –noprompt
說明:
讓客戶端信任服務端證書
2. 配置服務端為只允許HTTPS連線
2.1 配置Tomcat 目錄下的/conf/server.xml
Xml程式碼 收藏程式碼
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true" clientAuth="true"
sslProtocol="TLS" keystoreFile="D:/SSL/server/tomcat.keystore"
keystorePass="zljzlj" truststoreFile="D:/SSL/server/tomcat.keystore"
truststorePass="zljzlj" />
說明:

在server.xml裡面這段內容本來是被註釋掉的,如果想使用https的預設埠443,請修改這裡的port引數。其中的clientAuth="true" 指定了雙向證書認證。
2.2 配置服務端專案web.xml
在<welcome-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服務地址的訪問必須為https連線。<url-pattern>要根據你的web service服務地址配置。
3. 修改客戶端程式碼
在執行訪問之前,增加:
Java程式碼 收藏程式碼
System.setProperty("javax.net.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") ;
String endPoint="https://127.0.0.1:8443/easbCut/services/ApplyFormService";
...
通過設定引數來指定客戶端連線時所使用的客戶端證書,這裡還可以採用修改JVM啟動引數的的方式來執行,但出於不影響其他功能的考慮,這裡採用System.setProperty的方式來設定這些引數,在使用結束後,可以還原這些引數配置。


做為客戶端的開發者,可以把拿到的證書檔案後,只執行步驟3。