安裝及配置SSL支持
什么是安全套接字層技術?
安全套接字層(SSL)是允許Web瀏覽器和Web服務通過安全連接進行通信的技術。在這種安全連接上,數據在發送前經過加密碼,然后在接收時先解密再進行處理。瀏覽器和服務器在發送任何數據之前都對所有流量加密。SSL是針對下列重要的安全性考慮的:
身份驗證
在第一次嘗試與Web服務器通過安全連接通信時,這臺服務器將以服務器證書的形式向Web瀏覽器發送一份憑證。這個證書的目的是驗證這個站點就是它所宣稱的那一個。在有些情況下,服務器可能要求客戶端提供證明它就是它所宣稱的身份的證書(即客戶端身份驗證)。
機密性
數據通過網絡在客戶端與服務器之間傳送時,第三方可以查看并截獲該數據。SSL響應是加密的,這樣數據就不會被第三方解密而仍然保持其機密機。
完整性
當數據通過網絡在客戶端與服務器之間傳送時,第三方可以查看并截獲該數據。SSL幫助保證數據在傳輸過程中不被第三方修改。
要在自己的獨立Web服務器上安裝并配置SSL,需要下列組件。以下各節專門討論在Tomcat上啟用SSL支持。如果使用不同的Web服務器,請參照相應產品的文檔。
· Java 安全套接字擴展(Java Secure Socket Extension JSSE))(見使用JSSE)。
· 服務器證書keystore(見設置數字證書)。
· 一個HTTPS連接器(見配置SSL連接器)。
要驗證啟用了SSL支持,參見驗證SSL支持。
使用JSSE
如果使用J2SE SDK v1.3.1,那么需要安裝Java安全套接字擴展(JSSE)以使用SSL。JSSE是J2SE 1.4 SDK的一部分。JSSE是一組Java包,它使安全Internet通信成為可能。這些包實現了Java版本的SSL(安全套接字層)和TLS(傳輸層安全性)協議并包括數據加密、服務器身份驗證、消息完整性和可選的客戶端驗證功能。使用JSSE,開發者在可以為客戶端和運行任何TCP/IP之上的應用協議(如HTTP、Telnet、NNTP和FTP)的服務器之間提供安全數據傳輸。
在默認情況下,jsse.jar文件的位置是<JAVA_HOME>/jre/lib/jsse.jar。有關JSSE的更多信息,參見其Web站點http://java.sun.com/products/jsse/。
設置數據證書
為了實現SSL,一個Web服務必須對每一個接受安全連接的外部接口或者IP地址有一個相關聯的證書。這種設計背后的理論是服務器應該對其擁有者身份提供某種合理的保證,特別是在接收任何敏感信息之前。將證書想像為Internet地址的“數字驅動的許可許”可能會有幫助。它聲明這個站點與哪個公司相關聯,以及站點所有者或者管理員的一些基本聯系信息。
數字證書是由其擁有者加密簽名,任何其他人都難以仿造。對于涉及電子商務的站點,或者任何其他身份驗證起重要作用的業務交易站點,可以從像verisign或者Thawte這樣的著名證書頒發機構(Certificate Authority CA)購買證書。
如果身份驗證并不很重要,比如管理員只是希望保證服務器發送和接收的數據是私有的并且不能被連接中的任何竊聽者探聽到,則可以只是使用自簽名的證書,從而省去獲取CA證書的時間和成本。
SSL使用公鑰加密,它基于密鑰對。密鑰對包含一個公鑰和一個私鑰。如果數據是用其中一把鑰匙加密的,那么只能用鑰匙對中的另一把鑰匙解密。這種特性是建立交易信任和私有性的基礎。例如,使用SSL時,服務器計算出一個值并用其私鑰加密這個值。加密的值稱為數字簽名??蛻舳擞梅掌鞯墓€解密這個加密的值并將這個值與它自己的計算值進行比較。如果這兩個值相匹配,那么客戶端就可以信任簽名是真的,因為只有用私鑰才可以生成這個簽名。
數字證書與HTTPS協議一共使用以驗證Web客戶端身份。除非安裝了數字證書,否則大多數Web服務的HTTPS服務都不會運行。使用下面描述的過程設置可以被Web服務器使用的數字證書以啟用SSL。
一種可以用于設置數字證書的工具是keytool,這是一種與J2SE 1.4 SDK一同發布的密鑰和證書管理工具。它使用戶可以管理他們自己的公/私鑰對以及相關的證書,以在自驗證(用戶向其他用戶/服務驗證他/她自己)或者數字完整性和身份驗證服務用使用。它還讓用戶可以緩存他們通信伙伴的公鑰(以證書的形式)。要更好地理解公鑰加密,參閱以下地址上的文檔
http://java.sun.com/j2se/1.4.1/docs/tooldocs/solaris/keytool.html
證書是來自某一實體(人員、公司等)的數字簽名的聲明,表明其他實體的公鑰(或者一些其他信息)有一個特定值。當對數據進行數字簽名后,可以對該簽名進行驗證以檢查數字完整性和真實性。完整性意味著數據沒有被修改或者篡改,真實性意味著數據確實是來自宣稱創建和對它簽名的地方。
keytool將儲存密鑰和證書儲存在一個名為keystore的文件中。Keystore的默認實現將keystore實現為一個文件。它用密碼保護私鑰。有關keytool的更多信息,參閱以下地址的文檔
http://java.sun.com/j2se/1.4.1/docs/tooldocs/solaris/keytool.html
本節描述創建一個名為server.keystore的服務器keystore以及名為client.keystore的客戶端keystore。這兩個文件構成一個密鑰對。這些文件通常是在<HOME>目錄中或者在應用程序目錄中創建的。
除了服務器和客戶端keystore,還必須有簽名的證書,它必須存在于服務器上。在服務器驗證客戶端身份時,這個文件必須包含證書頒發機構的公鑰證書或者客戶端的公鑰證書。我們將在<HOME>目錄中創建server.cer。
通常,keystore文件是由密碼保護的。對于server.keystore、client.keystore和server.cer文件這個密碼的默認值是changeit。
我們使用keytool工具創建keystore文件。可以在<JAVA_HOME>/bin目錄中找到keytool工具。
要設置數字證書,
1. 生成密鑰對
keytool工具使您可以生成密鑰對。隨J2SE SDK發布的keytool工具在程序中增加了實現了RSA算法的Java 密碼擴展提供程序。這個提供程序使您可以導入RSA簽名的證書。
如下運行keytool工具以生成keystore文件,用keystore文件的名字替換<keystore_filename>,例如server.keystore。如果使用Tomcat服務器,文件必須命名為.keystore并位于Tomcat運行的計算機的home目錄中,或者通過在Tomcat配置文件中的<Factory>元素中添加一個keystoreFile屬性、或者在admintool的Connector (8443)節點上指定該文件的位置以告訴Tomcat這個keystore文件是什么地方。
keytool -genkey -keyalg RSA -alias tomcat-server
-keystore <keystore_filename>
2. keytool工具提示您加入以下信息:
a. Keystore password--輸入默認密碼,即changeit。有關改變密碼的信息參見keytool文檔。
b. First and last name——輸入適當的值,例如JWSDP。
c. Organizational unit——輸入適當的值,例如Java Web Services。
d. Organization——輸入適當的值,如Sun Microsystems。
e. City or locality——輸入適當的值,例如Santa Clara。
f. State or province——.輸入非縮寫名,如CA。
g. Two-letter country code-——對于美國,雙字母國家代碼是US。
h. Review the information you've entered so far, enter Yes if it is correct.檢查輸入的信息,如果都正確,則輸入Yes。
i. Key password for the Web server——不輸入密碼。按回車。
下一步是為該keystore生成簽名的證書。一個自簽名的證書對于大多數SSL通信來說是可以接受的。如果使用自簽名的證書,則進入創建自簽名的證書。如果想讓證書由CA數字簽名,則進入獲取數字簽名的證書。
創建自簽名的證書
本例假設keystore命名為server.keystore,證書文件是server.cer,CA文件是cacerts.jks。在<HOME>目錄中運行以下命令以使它們創建到這里。
1. 將服務器證書導出為證書文件:
keytool -keystore server.keystore -export -alias tomcat-server -file server.cer
2. 輸入密碼(changeit):
Keytool返回下列消息:
Certificate stored in file <server.cer>
3. 將新的服務器證書導入到證書頒發機構文件cacerts.jks:
keytool -import -alias serverCA -keystore <HOME>/cacerts.jks
-file server.cer
4. 輸入密碼(changeit)。
Keytool返回類似下面的消息:
Owner: CN=JWSDP, OU=Java Web Services, O=Sun, L=Santa Clara,
ST=CA, C=US
Issuer: CN=JWSDP, OU=Java Web Services, O=Sun, L=Santa Clara,
ST=CA, C=US
Serial number: 3e39e3e0
Valid from: Thu Jan 30 18:48:00 PST 2003 until: Wed Apr 30 19:48:00 PDT 2003
Certificate fingerprints:
MD5: 44:89:AF:54:FE:79:66:DB:0D:BE:DC:15:A9:B6:09:84
SHA1:21:09:8A:F6:78:E5:C2:19:D5:FF:CB:DB:AB:78:9B:98:8D:06:8C:71
Trust this certificate? [no]: yes
Certificate was added to keystore
獲取數字簽名的證書
本例假設keystore命名為server.keystore,證書文件為server.cer,并且CA文件是cacerts.jks。
1. CA獲得數字簽名的證書。為此,
a. 生成證書簽名請求(Certificate Signing Request CSR)。
keytool -certreq -alias tomcat-server -keyalg RSA
-file <csr_filename> -keystore cacerts.jks
b. 發送csr_filename的內容以進行簽名。
c. 如果使用Verisign CA,則進入http://digitalid.verisign.com/。Verisign將在電子郵件中發送簽名的證書。將這個證書儲存在一個文件中。
d. 將通過電子郵件收到的簽字的證書導入服務器:
keytool -import -alias tomcat-server -trustcacerts -file
<signed_cert_file> -keystore <keystore_filename>
2. 導入證書(如果使用CA簽名的證書)。
如果證書是由證書頒發機構(CA)簽名,那么必須導入CA證書。如果只使用自簽名證書則可跳過這一步。如果使用自簽名證書或者由瀏覽器不識別的CA簽名的證書,那么用戶第一次試圖訪問服務器時就會跳出一個對話框。用戶可以選擇只在這個會話中、還是永遠信任這個證書。
要在標準版本的Java 2平臺安裝CA證書,如下運行keytool工具。
keytool -import -trustcacerts -alias root
-file <ca-cert-filename> -keystore <keystore-filename>
為相互驗證創建客戶端證書
創建客戶端證書的過程與創建服務器證書類似。
1. 用keytool在所選的keystore文件中創建客戶端證書:
keytool -genkey -keyalg RSA -alias jwsdp-client -keystore client.keystore
會提示輸入密碼。輸入默認密碼changeit。根據提示輸入名字、組織和其他客戶端信息。不要在“Key password for <client>”輸入任何內容,只需要按回車。
2. 將新客戶端證書從keystore導出到證書文件:
keytool -keystore client.keystore -export -alias jwsdp-client -file client.cer
3. 輸入keystore密碼(changeit)。Keytool將返回該消息:
Certificate stored in file <client.cer>
4. 將新客戶端證書導入到服務器的證書頒發機構文件cacerts.jks中。這使服務器在SSL相互驗證過程中信任該客戶端。
keytool -import -alias root -keystore <HOME>/cacerts.jks
-file client.cer
5. 輸入keystore密碼(changeit)。Keytool返回下面的消息:
Owner: CN=JWSDP Client, OU=Java Web Services, O=Sun, L=Santa
Clara, ST=CA, C=US
Issuer: CN=JWSDP Client, OU=Java Web Services, O=Sun, L=Santa Clara, ST=CA, C=US
Serial number: 3e39e66a
Valid from: Thu Jan 30 18:58:50 PST 2003 until: Wed Apr 30
19:58:50 PDT 2003
Certificate fingerprints:
MD5: 5A:B0:4C:88:4E:F8:EF:E9:E5:8B:53:BD:D0:AA:8E:5A
SHA1:90:00:36:5B:E0:A7:A2:BD:67:DB:EA:37:B9:61:3E:26:B3:89:46:
32
Trust this certificate? [no]: yes
Certificate was added to keystore
檢查相互驗證是否已運行
要證明SSL握手已進行,關閉Tomcat,在<JWSDP_HOME>/bin/catalina.bat文件中發送debug旗標,然后重新啟動Tomcat。服務將顯示握手消息,或者將它們寫入文件<JWSDP_HOME>/logs/launcher.server.log中。下面例子以粗體顯示新代碼。
rem Execute the Tomcat launcher
"%JAVA_HOME%\bin\java.exe" -Djavax.net.debug=ssl,handshake
-classpath %PRG%\..;%PRG%\..\..\jwsdp-shared\bin;"%PRG%
在Tomcat服務器使用PKCS12證書
Java WSDP支持PKCS12格式的證書。PKCS12標準規定儲存或者傳輸用戶私鑰、證書和各種秘密的可移植格式。更多信息參見以下Web站點:
http://www.rsasecurity.com/rsalabs/pkcs/pkcs-12
如果有PKCS12格式的證書,那么必須將它轉換為JKS格式。進行轉換的命令是:
keytool -pkcs12 -pkcsFile <fileName> -pkcsKeyStorePass
<password> -pkcsKeyPass <password> -jksFile <outputFileName>
-jksKeyStorePass <password>
結果是一個含有密鑰——私鑰和證書鏈——的JKS文件。
用帶-export選項的keytool將證書導出到一個文件中,如abc.cer:
keytool -keystore <outputFileName> -export -alias <server> -file abc.cer
證書的各種命令
· 檢查服務器證書的內容:
keytool -list -keystore server.keystore -alias tomcat-server -v
· 檢查cacerts文件的內容:
keytool -list -keystore cacerts.jks
配置SSL連接器
取決于Web服務器,可能它會啟用SSL HTTPS連接器,也可能不啟用。如果使用Tomcat服務器,那么就沒有配置SSL連接器。本節描述如何為Tomcat配置SSL HTTPS連接器。如果使用其他Web服務器,則應該參考相應服務器的文檔。
在部署描述符中必須包含一個用于SSL連接的元素Connector。在改變服務器部署描述符之前,必須關閉服務器。下列代碼是在Web服務器上啟用SSL連接器的代碼示例:
<Connector
className="org.apache.coyote.tomcat5.CoyoteConnector"
port="8443" minProcessors="5" maxProcessors="75"
enableLookups="true" acceptCount="10" debug="0"
scheme="https" secure="true" useURIValidationHack="false">
<Factory className="com.sun.web.security.SSLSocketFactory"
clientAuth="false" protocol="TLS" debug="0" />
</Connector>
這個Connector元素的屬性在附錄A Tomcat服務器管理工具中有更詳細的描述??梢允褂孟旅鎯煞N方法之一向Tomcat添加SSL HTTPS連接器:
· 使用admintool添加Connector。參見在admintool中添加SSL連接器。
· 向服務器的部署描述符添加SSL連接器的Connector元素。參見在server.xml中配置SSL。
在admintool中添加SSL連接器
要用admintool配置SSL連接器,必須首先像在設置數字證書中所描述的那樣創建一個keystore。Tomcat會在它所運行的計算機上的主目錄中尋找名為.keystore的keystore。確認已經創建了keystore以后,進行以下步驟:
1. 如果Tomcat還沒有啟動,就啟動它。
2. 在Web瀏覽器中輸入http://localhost:8080/admin in a Web browser啟動admintool。
3. 輸入為admin角色指定的用戶名和密碼組合。
4. 在左邊窗格中選擇服務(Java Web Services Developer Pack)。
5. 從右邊窗格中的下拉列表中選擇Create New Connector。
6. 在Type域,選擇HTTPS。
7. 在Port域,輸入8443(或者其他所要求的端口)。這會定義Tomcat會監聽哪個安全連接的TCP.IP端口號。
8. 如果創建了keystore,其名字不是.keystore,如果keystore不在Tomcat所運行的計算機上的home目錄中,或者密碼不是默認值changeit,則輸入Keystore Name和keystore Password。如果使用了期望值,則可以不填寫這些域。
在Unix和Linux系統中home目錄是/home/user_name,在Microsoft Windows系統中是C:\Documents and Settings\user_name。
9. 選擇Save以為該會話保存新Connector。
10. 選擇Commit Changes以將新Connector信息寫入文件server.xml,這樣下次Tomat啟動時它就是可用的了。
要查看和/或者編輯新創建的Connector,展開Service(Java Web Services Developer Pack)節點,并選擇Connector(8443)。
在server.xml中配置SSL Connector
在默認server.xml中包括了一個SSL Connector的示例Connector元素。在默認情況下這個Connector元素是注釋掉的。要為Tomcat啟用SSL Connector,去掉圍繞著SSL Connector元素的注釋標記。為此,執行以下步驟。
1. 如果Tomcat正在運行,則關閉它。當Tomcat再次啟動時對<JWSDP_HOME>/conf/server.xml文件的修改就可被它使用了。
2. 在文本編輯器中打開文件<JWSDP_HOME>/conf/server.xml。
3. 在文件中找到下代碼部分(可以試著搜索SSL Connector)。刪除圍繞Connector項的注釋。要刪除的注釋標簽以粗體表示。
<!-- SSL Connector on Port 8443 -->
<!--
<Connector
className="org.apache.coyote.tomcat4.CoyoteConnector"
port="8443" minProcessors="5"
maxProcessors="75"
enableLookups="false"
acceptCount="10"
connectionTimeout="60000" debug="0"
scheme="https" secure="true">
<Factory
className="org.apache.coyote.tomcat4.
CoyoteServerSocketFactory"
clientAuth="false" protocol="TLS" />
</Connector>
-->
4. 保存并關閉文件。
5. 啟動Tomcat。
在Tomcat管理工具文檔中對這個Connector元素中的屬性有更詳細的描述。
驗證SSL支持
為了進行測試,并驗證SSL支持已經正確安裝,用連接到在服務器部署描述符中定義的端口的URL裝載默認的介紹頁面:
https://localhost:8443/
這個URL中的https表明瀏覽器應該使用SSL協議。端口8443就是在前面一步中創建SSL Connector的端口
用戶第一次裝載這個應用程序時,會顯示New Site Certificate對話框。選擇Next通過一系列New Site Certificate對話框,到達最后一個對話框時,選擇Finish。
有關運行SSL的一般性提示
SSL協議設計為盡可能地高效和安全。不過,從性能的角度看,加密/解密是一種需要大量計算的過程。不一定要將整個Web應用都放到SSL上,并且一般由開發者決定哪一頁面需要安全連接,哪一頁面不需要??赡苄枰踩B接的頁面包括登錄頁面、個人信息頁面、購物小車付款、或者任何其他可能傳送信用卡號的頁面??梢詢H通過加在地址上用https個取代http前綴而使應用程序中的任何一頁面運行在安全套接字上。對任何絕對要求安全連接的頁面都應該檢查與該頁面請求相關聯的協議類型,如果沒有指定https就要采取相應措施。
使用在安全連接上的基于名字的虛擬主機可能會有問題。這是SSL協議本身的一個設計局限。SSL握手必須在訪問HTTP請求之前發生,在握手時客戶端瀏覽器接受服務器證書。結果,不能在身份驗證之前確定包含虛擬主機名的請求信息,并且因此不可能對一個IP地址指定多個證書。如果在一個IP地址上的所有虛擬主機需要針對同一個證書進行驗證,那么額外的多個虛擬主機就不應該介入服務器上的普通SSL操作。不過要知道,大多數客戶端瀏覽器會比較服務器的域名和在證書中列出的域名,如果有列出的話(主要適用于正式的、CA簽名的證書)。如果域名不匹配,那么這些瀏覽器將向客戶端顯示一個警告。一般來說,在生產環境中只有基于地址的虛擬主機通常會使用SSL。
SSL連接的故障排除
啟動Tomcat時,得到這樣的異常“"java.io.FileNotFoundException: {some-directory}/{some-file} not found”
一個可能的解釋是Tomcat不能找到它要尋找的keystore文件。在默認情況下,Tomcat期待keystore命名為.keystore,并且位于Tomcat所在的系統中的home目錄(與您自己的計算機上的home目錄可能一致、也可能不一致) 。如果keystore文件是在其他位置,那么就需要在Tomcat配置文件中的<Factory>元素上添加一個keystoreFile屬性,或者在admintool的Connector (8443)節點指定文件的位置。
Tomcat啟動時,得到這樣的異常“"java.io.FileNotFoundException: Keystore was tampered with, or password was incorrect”。
假設沒有人改變了您的keystore文件,最有可能的原因是Tomcat使用了與創建keystore文件時使用的不同的密碼。要解決這個問題,可以返回并重新創建keystore文件,也可以在Tomcat配置文件中的<Factory>元素上、或者在的Connector (8443)節點上添加keystorePass屬性——提醒--密碼是大小寫敏感的。
如果仍然有問題,
如果仍然有問題,郵件列表是一個好的信息資源??梢栽?a target=_blank>http://jakarta.apache.org/site/mail.html上查看這個列表中以前的消息,還可以預訂和取消預訂信息。
有關SSL的進一步信息
更多信息請參閱<JWSDP_HOME>/docs/tomcat/ssl-howto.html上的Tomcat文檔SSL Configuration HOW-TO。
JAX-RPC的安全性
在本節,將學習如何配置基于JAX-RPC的Web服務應用程序以進行HTTP/SSL上的基本和相互身份驗證。如果驗證對于您來說還是一個新題目,那么請參見驗證Web資源的用戶那一節。
在本教程中,我們要修改<JWSDP_HOME>/docs/tutorial/examples/jaxrpc/hello中的示例應用程序以添加HTTP/S基本和相互身份驗證??梢栽谀夸?lt;JWSDP_HOME>/docs/tutorial/examples/jaxrpc/security中找到所得到的應用程序。下列步驟是向hello例子中添加基本驗證的必要步驟:
· 創建相應的證書和keystore(參見第1步:為基本身份驗證創建SSL證書)。
· 確保為服務器配置了SSL 連接器。Tomcat服務器沒有配置SSL Connector,所以需要添加SSL Connector(參見配置SSL連接器)并在生成的keystore文件中添加信息(見第2步:配置SSL 連接器)。
· .向部署描述符web.xml添加安全元素。有關操作信息參見第3步:向web.xml添加安全元素。
· 在應用程序的build.properties文件中修改端點地址,并添加運行這個例子所需要的其他屬性。參見第4步:編輯Build屬性。
· 在客戶端代碼中設置安全屬性。有關操作信息參見第5步:在客戶端代碼中設置安全屬性。
· 編譯并運行Web服務。有關對示例應用程序完成這項操作的信息見第6步:創建NewAnt Target以運行這個例子。
在這里描述為Web服務配置HTTP/S上的基本身份驗證的步驟。對于相互身份驗證,完成下述步驟,再按啟用SSL上的相互驗證中的說明添加客戶端驗證。
第1步:為基本身份驗證創建SSL證書
注:在設置數字證書中對這些信息有更詳細的討論。本節總結了為這個例子創建SSL證書所需要的步驟。
我們將用工具keytool生成SSL證書并將它們導出為相應的服務器和客戶端keystore。記住服務器和客戶端keystore是在運行keytool的目錄中創建的。因為我們是向hello Web服務添加安全性,所以我們從修改的示例應用程序所在目錄中運行keytool,這就是<JWSDP_HOME>/docs/tutorial/examples/jaxrpc/security目錄。這樣,keystore就在security Web服務的代碼所在的同一目錄中生成。
1. 運行keytool以生成服務器和客戶端keystore。對于基本身份驗證,只需要將服務器證書導入到客戶端keystore。用默認密碼changeit生成服務器keystore。
要生成服務keystore,在終端窗口輸入下面內容。在繼續之前確是在<JWSDP_HOME>/docs/tutorial/examples/jaxrpc/security目錄中。
注意在按Enter時,keytool提示您輸入服務器名、組織單位、組織、所在地、州和國家代碼。注意必須在keytool的要求輸入姓和名的第一個提示中輸入服務器名。為了進行測試,可以用localhost。這個主機必須與在第4步:編輯Build屬性中指定的端點地址中標識的主機相匹配。
<J2SE_HOME>\bin\keytool -genkey
-alias tomcat-server
-keyalg RSA -keypass changeit
-storepass changeit
-keystore server.keystore
2. 導出生成的服務器證書。
<J2SE_HOME>\bin\keytool -export -alias tomcat-server
-storepass changeit -file server.cer -keystore
server.keystore
3. 生成客戶端keystore。
要生成客戶端keystore,在終端窗口中輸入以下內容:
注意在按Enter時,keytool提示您輸入客戶端的服務器名、組織單位、組織、所在地、州和國家代碼。注意必須在keytool的要求輸入姓和名的第一個提示中輸入服務器名。在大多數情況下,為了進行測試,可以使用localhost。這個主機必須與在第4步:編輯Build屬性中指定的端點地址中標識的主機相匹配。
<J2SE_HOME>\bin\keytool -genkey -alias jwsdp-client -keyalg
RSA -keypass changeit -storepass changeit -keystore
client.keystore
4. 將服務器證書導入客戶端的keystore。
<J2SE_HOME>\bin\keytool -import -v -trustcacerts
-alias tomcat-server -file server.cer
-keystore client.keystore -keypass changeit
-storepass changeit
第2步:配置SSL連接器
注:在配置SSL 連接器一節中更詳細地提供了配置SSL 連接器的步驟。本節中的步驟是為了您的方便提供的。
需要為Tomcat配置一個SSL Connector。如果使用不同的服務器,參見配置SSL 連接器中配置SSL Connector的一般信息。除了為服務配置一個SSL 連接器外,還必須在添加SSL連接器的同一位置上添加有關keystore文件的信息及其密碼。例如,在Java WSDP中,首先需要從SSL Connector周圍刪除注釋標簽(<!-- ... -->),然后在<JWSDP_HOME>/conf/server.xml文件中的這一部分添加以粗體顯示的信息。
<!-- SSL Connector on Port 8443 -->
<Connector className="org.apache.coyote.tomcat4.CoyoteConnector"
port="8443" minProcessors="5" maxProcessors="75"
enableLookups="false"
acceptCount="10" debug="0" scheme="https" secure="true">
<Factory className= "org.apache.coyote.tomcat4.CoyoteServerSocketFactory">
keystoreFile=
"<JWSDP_HOME>/docs/tutorial/examples/jaxrpc/security/ server.keystore"
keystorePass="changeit"
clientAuth="false" protocol="TLS" debug="0" />
</Connector>
第3步:向web.xml添加安全元素
這個例子的文件在<JWSDP_HOME>/docs/tutorial/examples/jaxrpc/security目錄中。要通過SSL進行身份驗證,web.xml文件包括<security-constraint>、 <login-config>,和<security-role>元素。在基本<JWSDP_HOME>/docs/tutorial/examples/jaxrpc/hello例子之上添加了粗體的代碼。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application
2.3//EN"
"http://java.sun.com/j2ee/dtds/web-app_2_3.dtd">
<web-app>
<display-name>Hello World Application (secure)</display-name>
<description>HTTPS example using JAX-RPC </description>
<session-config>
<session-timeout>60</session-timeout>
</session-config>
<security-constraint>
<web-resource-collection>
<web-resource-name>SecureHello</web-resource-name>
<url-pattern>/security</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>manager</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
<security-role>
<role-name>manager</role-name>
</security-role>
</web-app>
注意<role-name>元素指定了manager,這是一個已經在Tomcat的部署描述符(<JWSDP_HOME>/conf/tomcat-users.xml)中指定的角色。有關角色定義和鏈接的更多內容,參見安全性角色。
第4步:編輯Build屬性
要以HTTP/SSL上的基本身份驗證運行這個應用程序,我們向build.properties文件添加與keystore文件相關的一些屬性及其密碼,這個文件位于<JWSDP_HOME>/docs/tutorial/examples/jaxrpc/security目錄中。下述例子假設運行的是Java WSDP 1.1。以粗體標記的項被添加到文件中。在后面一節中運行它時,所添加的項將作為參數傳遞給客戶端應用程序。
# This file is referenced by the build.xml file.
example=security
context-path=security-jaxrpc
client-class=security.HelloClient
client-jar=${example}-client.jar
portable-war=${example}-portable.war
deployable-war=${context-path}.war war-path=${tut- root}/tutorial/examples/jaxrpc/${example}/dist/${deployable- war}
trust-store=${tut-root}/tutorial/examples/jaxrpc/security/cli-
ent.keystore
trust-store-password=changeit
第5步:在客戶端代碼中設置安全屬性
客戶端的源代碼在<JWSDP_HOME>/docs/tutorial/examples/jaxrpc/security目錄中的HelloClient.java文件中。對于SSL上的基本身份驗證,客戶端代碼必須設置幾項安全相關的屬性。
· trust-store屬性——trust-store屬性的值是客戶端 keystore文件的完全限定名:<JWSDP_HOME>/docs/tutorial/examples/jaxrpc/security/client.keystore
· trust-store-password屬性——trust-store-password屬性是keystore的密碼。這個密碼的默認值是changeit。
· username和 password屬性——username和password屬性對應于manager角色(見安全性角色)。
客戶端如下設置前述的安全屬性。粗體的代碼是在原來的jaxrpc/hello示例應用程序上添加的代碼。
package security; import javax.xml.rpc.Stub;
public class HelloClient {
public static void main(String[] args) {
if (args.length !=4) {
System.out.println("Usage: ant run-security"); System.exit(1); }
String trustStore=args[0];
String trustStorePassword=args[1]; String username=args[2]; String password=args[3];
System.out.println("trustStore: " + trustStore); System.out.println("trustStorePassword: " +
trustStorePassword);
System.out.println("username: " + username);
System.out.println("password: " + password);
try {
Stub stub = createProxy();
System.setProperty("javax.net.ssl.trustStore", trustStore);
System.setProperty("javax.net.ssl.trustStorePassword", trustStorePassword);
stub._setProperty(javax.xml.rpc.Stub.USERNAME_PROPERTY,
username);
stub._setProperty(javax.xml.rpc.Stub.PASSWORD_PROPERTY, password);
HelloIF hello = (HelloIF)stub;
System.out.println(hello.sayHello("Duke! I feel
secure!"));
} catch (Exception ex) {
ex.printStackTrace();
}
}
private static Stub createProxy() {
// Note: MyHelloService_Impl is implementation-specific.
return (Stub)(new MyHello_Impl().getHelloIFPort());
}
}
第6 步:創建New Ant Target以運行這個例子
運行hello示例應用程序的現有目標還不足以運行運行安全版本的應用程序。需要傳遞關于keystore及其密碼的信息,以及用戶名及用戶密碼。下列targe添加到<JWSDP_HOME>/docs/examples/jaxrpc/security/build.xml文件中,以便于運行安全的JAX-RPC例子:
<target name="run-security"
description="Runs a client with authentication
over ssl">
<echo message="Running the ${client-class} program...." />
<java
fork="on"
classpath="${dist}/${client-jar}:${jwsdp-jars}"
classname="${client-class}" >
<arg value="${trust-store}" />
<arg value="${trust-store-password}" />
<arg value="${username}" />
<arg value="${password}" />
</java>
</target>
第7步:編譯并運行這個例子
要編譯并在SSL上運行這個JAX-RPC例子,執行以下步驟:
1. 如果沒有做的話,按照設置中的指示,下載本教程的示例代碼,完成上述第1到2步,因為這些步驟是對您的計算機和實現特定的。
2. 確保Tomcat正在運行。
3. 進入<JWSDP_HOME>/docs/tutorial/examples/jaxrpc/security目錄。
4. 鍵入下述命令:
ant build
ant package
ant deploy
ant build-static
ant run-security
客戶端應該顯示下述輸出:
% ant run-security
Buildfile: build.xml
run-security:
[echo] Running the security.HelloClient program...
[java] trustStore: <JWSDP_HOME>/docs/tutorial/examples/
jaxrpc/security/client.keystore
[java] trustStorePassword: changeit
[java] username: your_name
[java] password: your_password
[java] Hello - secure Duke! I feel secure!
BUILD SUCCESSFUL
啟用SSL上的相互身份驗證
TJAX-RPC安全性一節對設置服務器端身份驗證進行了討論。本節討論設置客戶端身份驗證。當服務器和客戶端身份驗證都啟用時,這稱為相互、或者雙向驗證。在客戶端身份驗證中,客戶端需要提交由你所選擇的可以接受的證書頒發機構頒發的證書。至少有兩種途徑啟用客戶端身份驗證。
1. .配置SSL套接字工廠啟用客戶端驗證。例如,要為Tomcat配置SSL套接字工廠 ,要設置clientAuth="true",如下面代碼示例中的粗體部分。以這種方式啟用客戶端驗證,對于所有通過特定SSL端口進入的請求都會要求客戶端驗證。與對Web服務配置文件所做的所有改變一樣,必須停止并重新啟動Web服務以使這種改變生效。
<!-- SSL Connector on Port 8443 -->
<Connector className="org.apache.coyote.tomcat4.CoyoteConnector"
port="8443" minProcessors="5" maxProcessors="75"
enableLookups="false"
acceptCount="10" debug="0" scheme="https" secure="true">
<Factory className=
"org.apache.coyote.tomcat4.CoyoteServerSocketFactory">
keystoreFile=
"<JWSDP_HOME>/docs/tutorial/examples/jaxrpc/security/
server.keystore"
keystorePass="changeit"
clientAuth="true" protocol="TLS" debug="0" />
</Connector>
2. 如下面粗體部分所示。以這種方法啟用客戶端身份驗證,客戶端身份驗證是對特定的應用程序啟用的。
<login-config>
<auth-method>CLIENT-CERT</auth-method>
</login-config>
3. 如果同時用上述兩種方法啟用客戶端身份驗證,那么客戶端身份驗證將會執行兩次。
為JAX-RPC安全示例配置相互驗證
要以相互驗證配置并創建JAX-PRC服務,執行JAX-RPC安全性中的所有步驟,直到ant build-static命令 (包括這一步)。然后執行以下步驟:
1. 生成客戶端證書,導出它,再將客戶端證書導入服務器keystore,如為相互驗證創建客戶端證書中所討論的。
2. 編輯web.xml以將部署描述符中的登錄配置部分的身份驗證方法改為CLIENT-CERT。
<login-config>
<auth-method>CLIENT-CERT</auth-method>
</login-config>
3. :運行這個應用程序:
ant run-security
客戶端應該顯示以下一行:
Hello Duke! I feel secure!
致謝:本節包括由Rahul Sharma和Beth Stearns編寫的“Web Services Security Configuration”白皮書中的內容。
EIS層安全性
在EIS層,應用程序組件請求到EIS資源的連接。作為這種連接的一部分,EIS可能請求對資源的sign-on。應用程序組件提供者有兩設計這種EIS sign-on的選擇:
· 使用容器托管的sign-on方式,應用程序組件讓容器負責配置并管理EIS sign-on。容器確定用戶名和密碼以建立到EIS實例的連接。
· 用組件托管的sign-on方式,應用程序組件代碼通過加入執行sign-on過程的代碼管理EIS sign-on。
容器托管的登錄(Sign-On)
使用容器托管的登錄,應用程序組件不必為了登錄資源而向getConnection()方法傳遞任何安全信息。安全信息是由容器提供的,如下面的例子所示。
// Business method in an application
component Context initctx = new InitialContext();
// Perform JNDI lookup to obtain a connection factory javax.resource.cci.ConnectionFactory cxf =
(javax.resource.cci.ConnectionFactory)initctx.lookup(
"java:comp/env/eis/MainframeCxFactory");
// Invoke factory to obtain a connection. The security
// information is not passed in the getConnection method
javax.resource.cci.Connection cx = cxf.getConnection();
...
組件托管的登錄
使用組件管理的登錄,應用程序組件負責向getConnection()方法傳遞登錄資源所需要的安全信息。安全信息可以是用戶名和密碼,如下例所示:
// Method in an application
component Context initctx = new InitialContext();
// Perform JNDI lookup to obtain a connection factory javax.resource.cci.ConnectionFactory cxf =
(javax.resource.cci.ConnectionFactory)initctx.lookup(
"java:comp/env/eis/MainframeCxFactory");
// Get a new ConnectionSpec
com.myeis.ConnectionSpecImpl properties = //..
// Invoke factory to obtain a connection
properties.setUserName("...");
properties.setPassword("...");
javax.resource.cci.Connection cx =
cxf.getConnection(properties);
...