什么是安全套接字層技術(shù)(轉(zhuǎn))
安裝及配置SSL支持
什么是安全套接字層技術(shù)?
安全套接字層(SSL)是允許Web瀏覽器和Web服務(wù)通過安全連接進(jìn)行通信的技術(shù)。在這種安全連接上,數(shù)據(jù)在發(fā)送前經(jīng)過加密碼,然后在接收時(shí)先解密再進(jìn)行處理。瀏覽器和服務(wù)器在發(fā)送任何數(shù)據(jù)之前都對所有流量加密。SSL是針對下列重要的安全性考慮的:
身份驗(yàn)證
在第一次嘗試與Web服務(wù)器通過安全連接通信時(shí),這臺(tái)服務(wù)器將以服務(wù)器證書的形式向Web瀏覽器發(fā)送一份憑證。這個(gè)證書的目的是驗(yàn)證這個(gè)站點(diǎn)就是它所宣稱的那一個(gè)。在有些情況下,服務(wù)器可能要求客戶端提供證明它就是它所宣稱的身份的證書(即客戶端身份驗(yàn)證)。
機(jī)密性
數(shù)據(jù)通過網(wǎng)絡(luò)在客戶端與服務(wù)器之間傳送時(shí),第三方可以查看并截獲該數(shù)據(jù)。SSL響應(yīng)是加密的,這樣數(shù)據(jù)就不會(huì)被第三方解密而仍然保持其機(jī)密機(jī)。
完整性
當(dāng)數(shù)據(jù)通過網(wǎng)絡(luò)在客戶端與服務(wù)器之間傳送時(shí),第三方可以查看并截獲該數(shù)據(jù)。SSL幫助保證數(shù)據(jù)在傳輸過程中不被第三方修改。
要在自己的獨(dú)立Web服務(wù)器上安裝并配置SSL,需要下列組件。以下各節(jié)專門討論在Tomcat上啟用SSL支持。如果使用不同的Web服務(wù)器,請參照相應(yīng)產(chǎn)品的文檔。
· Java 安全套接字?jǐn)U展(Java Secure Socket Extension JSSE))(見使用JSSE)。
· 服務(wù)器證書keystore(見設(shè)置數(shù)字證書)。
· 一個(gè)HTTPS連接器(見配置SSL連接器)。
要驗(yàn)證啟用了SSL支持,參見驗(yàn)證SSL支持。
使用JSSE
如果使用J2SE SDK v1.3.1,那么需要安裝Java安全套接字?jǐn)U展(JSSE)以使用SSL。JSSE是J2SE 1.4 SDK的一部分。JSSE是一組Java包,它使安全I(xiàn)nternet通信成為可能。這些包實(shí)現(xiàn)了Java版本的SSL(安全套接字層)和TLS(傳輸層安全性)協(xié)議并包括數(shù)據(jù)加密、服務(wù)器身份驗(yàn)證、消息完整性和可選的客戶端驗(yàn)證功能。使用JSSE,開發(fā)者在可以為客戶端和運(yùn)行任何TCP/IP之上的應(yīng)用協(xié)議(如HTTP、Telnet、NNTP和FTP)的服務(wù)器之間提供安全數(shù)據(jù)傳輸。
在默認(rèn)情況下,jsse.jar文件的位置是<JAVA_HOME>/jre/lib/jsse.jar。有關(guān)JSSE的更多信息,參見其Web站點(diǎn)http://java.sun.com/products/jsse/。
設(shè)置數(shù)據(jù)證書
為了實(shí)現(xiàn)SSL,一個(gè)Web服務(wù)必須對每一個(gè)接受安全連接的外部接口或者IP地址有一個(gè)相關(guān)聯(lián)的證書。這種設(shè)計(jì)背后的理論是服務(wù)器應(yīng)該對其擁有者身份提供某種合理的保證,特別是在接收任何敏感信息之前。將證書想像為Internet地址的“數(shù)字驅(qū)動(dòng)的許可許”可能會(huì)有幫助。它聲明這個(gè)站點(diǎn)與哪個(gè)公司相關(guān)聯(lián),以及站點(diǎn)所有者或者管理員的一些基本聯(lián)系信息。
數(shù)字證書是由其擁有者加密簽名,任何其他人都難以仿造。對于涉及電子商務(wù)的站點(diǎn),或者任何其他身份驗(yàn)證起重要作用的業(yè)務(wù)交易站點(diǎn),可以從像verisign或者Thawte這樣的著名證書頒發(fā)機(jī)構(gòu)(Certificate Authority CA)購買證書。
如果身份驗(yàn)證并不很重要,比如管理員只是希望保證服務(wù)器發(fā)送和接收的數(shù)據(jù)是私有的并且不能被連接中的任何竊聽者探聽到,則可以只是使用自簽名的證書,從而省去獲取CA證書的時(shí)間和成本。
SSL使用公鑰加密,它基于密鑰對。密鑰對包含一個(gè)公鑰和一個(gè)私鑰。如果數(shù)據(jù)是用其中一把鑰匙加密的,那么只能用鑰匙對中的另一把鑰匙解密。這種特性是建立交易信任和私有性的基礎(chǔ)。例如,使用SSL時(shí),服務(wù)器計(jì)算出一個(gè)值并用其私鑰加密這個(gè)值。加密的值稱為數(shù)字簽名。客戶端用服務(wù)器的公鑰解密這個(gè)加密的值并將這個(gè)值與它自己的計(jì)算值進(jìn)行比較。如果這兩個(gè)值相匹配,那么客戶端就可以信任簽名是真的,因?yàn)橹挥杏盟借€才可以生成這個(gè)簽名。
數(shù)字證書與HTTPS協(xié)議一共使用以驗(yàn)證Web客戶端身份。除非安裝了數(shù)字證書,否則大多數(shù)Web服務(wù)的HTTPS服務(wù)都不會(huì)運(yùn)行。使用下面描述的過程設(shè)置可以被Web服務(wù)器使用的數(shù)字證書以啟用SSL。
一種可以用于設(shè)置數(shù)字證書的工具是keytool,這是一種與J2SE 1.4 SDK一同發(fā)布的密鑰和證書管理工具。它使用戶可以管理他們自己的公/私鑰對以及相關(guān)的證書,以在自驗(yàn)證(用戶向其他用戶/服務(wù)驗(yàn)證他/她自己)或者數(shù)字完整性和身份驗(yàn)證服務(wù)用使用。它還讓用戶可以緩存他們通信伙伴的公鑰(以證書的形式)。要更好地理解公鑰加密,參閱以下地址上的文檔
http://java.sun.com/j2se/1.4.1/docs/tooldocs/solaris/keytool.html
證書是來自某一實(shí)體(人員、公司等)的數(shù)字簽名的聲明,表明其他實(shí)體的公鑰(或者一些其他信息)有一個(gè)特定值。當(dāng)對數(shù)據(jù)進(jìn)行數(shù)字簽名后,可以對該簽名進(jìn)行驗(yàn)證以檢查數(shù)字完整性和真實(shí)性。完整性意味著數(shù)據(jù)沒有被修改或者篡改,真實(shí)性意味著數(shù)據(jù)確實(shí)是來自宣稱創(chuàng)建和對它簽名的地方。
keytool將儲(chǔ)存密鑰和證書儲(chǔ)存在一個(gè)名為keystore的文件中。Keystore的默認(rèn)實(shí)現(xiàn)將keystore實(shí)現(xiàn)為一個(gè)文件。它用密碼保護(hù)私鑰。有關(guān)keytool的更多信息,參閱以下地址的文檔
http://java.sun.com/j2se/1.4.1/docs/tooldocs/solaris/keytool.html
本節(jié)描述創(chuàng)建一個(gè)名為server.keystore的服務(wù)器keystore以及名為client.keystore的客戶端keystore。這兩個(gè)文件構(gòu)成一個(gè)密鑰對。這些文件通常是在<HOME>目錄中或者在應(yīng)用程序目錄中創(chuàng)建的。
除了服務(wù)器和客戶端keystore,還必須有簽名的證書,它必須存在于服務(wù)器上。在服務(wù)器驗(yàn)證客戶端身份時(shí),這個(gè)文件必須包含證書頒發(fā)機(jī)構(gòu)的公鑰證書或者客戶端的公鑰證書。我們將在<HOME>目錄中創(chuàng)建server.cer。
通常,keystore文件是由密碼保護(hù)的。對于server.keystore、client.keystore和server.cer文件這個(gè)密碼的默認(rèn)值是changeit。
我們使用keytool工具創(chuàng)建keystore文件。可以在<JAVA_HOME>/bin目錄中找到keytool工具。
要設(shè)置數(shù)字證書,
1. 生成密鑰對
keytool工具使您可以生成密鑰對。隨J2SE SDK發(fā)布的keytool工具在程序中增加了實(shí)現(xiàn)了RSA算法的Java 密碼擴(kuò)展提供程序。這個(gè)提供程序使您可以導(dǎo)入RSA簽名的證書。
如下運(yùn)行keytool工具以生成keystore文件,用keystore文件的名字替換<keystore_filename>,例如server.keystore。如果使用Tomcat服務(wù)器,文件必須命名為.keystore并位于Tomcat運(yùn)行的計(jì)算機(jī)的home目錄中,或者通過在Tomcat配置文件中的<Factory>元素中添加一個(gè)keystoreFile屬性、或者在admintool的Connector (8443)節(jié)點(diǎn)上指定該文件的位置以告訴Tomcat這個(gè)keystore文件是什么地方。
keytool -genkey -keyalg RSA -alias tomcat-server
-keystore <keystore_filename>
2. keytool工具提示您加入以下信息:
a. Keystore password--輸入默認(rèn)密碼,即changeit。有關(guān)改變密碼的信息參見keytool文檔。
b. First and last name——輸入適當(dāng)?shù)闹担鏙WSDP。
c. Organizational unit——輸入適當(dāng)?shù)闹担鏙ava Web Services。
d. Organization——輸入適當(dāng)?shù)闹担鏢un Microsystems。
e. City or locality——輸入適當(dāng)?shù)闹担鏢anta 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生成簽名的證書。一個(gè)自簽名的證書對于大多數(shù)SSL通信來說是可以接受的。如果使用自簽名的證書,則進(jìn)入創(chuàng)建自簽名的證書。如果想讓證書由CA數(shù)字簽名,則進(jìn)入獲取數(shù)字簽名的證書。
創(chuàng)建自簽名的證書
本例假設(shè)keystore命名為server.keystore,證書文件是server.cer,CA文件是cacerts.jks。在<HOME>目錄中運(yùn)行以下命令以使它們創(chuàng)建到這里。
1. 將服務(wù)器證書導(dǎo)出為證書文件:
keytool -keystore server.keystore -export -alias tomcat-server -file server.cer
2. 輸入密碼(changeit):
Keytool返回下列消息:
Certificate stored in file <server.cer>
3. 將新的服務(wù)器證書導(dǎo)入到證書頒發(fā)機(jī)構(gòu)文件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
獲取數(shù)字簽名的證書
本例假設(shè)keystore命名為server.keystore,證書文件為server.cer,并且CA文件是cacerts.jks。
1. CA獲得數(shù)字簽名的證書。為此,
a. 生成證書簽名請求(Certificate Signing Request CSR)。
keytool -certreq -alias tomcat-server -keyalg RSA
-file <csr_filename> -keystore cacerts.jks
b. 發(fā)送csr_filename的內(nèi)容以進(jìn)行簽名。
c. 如果使用Verisign CA,則進(jìn)入http://digitalid.verisign.com/。Verisign將在電子郵件中發(fā)送簽名的證書。將這個(gè)證書儲(chǔ)存在一個(gè)文件中。
d. 將通過電子郵件收到的簽字的證書導(dǎo)入服務(wù)器:
keytool -import -alias tomcat-server -trustcacerts -file
<signed_cert_file> -keystore <keystore_filename>
2. 導(dǎo)入證書(如果使用CA簽名的證書)。
如果證書是由證書頒發(fā)機(jī)構(gòu)(CA)簽名,那么必須導(dǎo)入CA證書。如果只使用自簽名證書則可跳過這一步。如果使用自簽名證書或者由瀏覽器不識(shí)別的CA簽名的證書,那么用戶第一次試圖訪問服務(wù)器時(shí)就會(huì)跳出一個(gè)對話框。用戶可以選擇只在這個(gè)會(huì)話中、還是永遠(yuǎn)信任這個(gè)證書。
要在標(biāo)準(zhǔn)版本的Java 2平臺(tái)安裝CA證書,如下運(yùn)行keytool工具。
keytool -import -trustcacerts -alias root
-file <ca-cert-filename> -keystore <keystore-filename>
為相互驗(yàn)證創(chuàng)建客戶端證書
創(chuàng)建客戶端證書的過程與創(chuàng)建服務(wù)器證書類似。
1. 用keytool在所選的keystore文件中創(chuàng)建客戶端證書:
keytool -genkey -keyalg RSA -alias jwsdp-client -keystore client.keystore
會(huì)提示輸入密碼。輸入默認(rèn)密碼changeit。根據(jù)提示輸入名字、組織和其他客戶端信息。不要在“Key password for <client>”輸入任何內(nèi)容,只需要按回車。
2. 將新客戶端證書從keystore導(dǎo)出到證書文件:
keytool -keystore client.keystore -export -alias jwsdp-client -file client.cer
3. 輸入keystore密碼(changeit)。Keytool將返回該消息:
Certificate stored in file <client.cer>
4. 將新客戶端證書導(dǎo)入到服務(wù)器的證書頒發(fā)機(jī)構(gòu)文件cacerts.jks中。這使服務(wù)器在SSL相互驗(yàn)證過程中信任該客戶端。
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
檢查相互驗(yàn)證是否已運(yùn)行
要證明SSL握手已進(jìn)行,關(guān)閉Tomcat,在<JWSDP_HOME>/bin/catalina.bat文件中發(fā)送debug旗標(biāo),然后重新啟動(dòng)Tomcat。服務(wù)將顯示握手消息,或者將它們寫入文件<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服務(wù)器使用PKCS12證書
Java WSDP支持PKCS12格式的證書。PKCS12標(biāo)準(zhǔn)規(guī)定儲(chǔ)存或者傳輸用戶私鑰、證書和各種秘密的可移植格式。更多信息參見以下Web站點(diǎn):
如果有PKCS12格式的證書,那么必須將它轉(zhuǎn)換為JKS格式。進(jìn)行轉(zhuǎn)換的命令是:
keytool -pkcs12 -pkcsFile <fileName> -pkcsKeyStorePass
<password> -pkcsKeyPass <password> -jksFile <outputFileName>
-jksKeyStorePass <password>
結(jié)果是一個(gè)含有密鑰——私鑰和證書鏈——的JKS文件。
用帶-export選項(xiàng)的keytool將證書導(dǎo)出到一個(gè)文件中,如abc.cer:
keytool -keystore <outputFileName> -export -alias <server> -file abc.cer
證書的各種命令
· 檢查服務(wù)器證書的內(nèi)容:
keytool -list -keystore server.keystore -alias tomcat-server -v
· 檢查cacerts文件的內(nèi)容:
keytool -list -keystore cacerts.jks
配置SSL連接器
取決于Web服務(wù)器,可能它會(huì)啟用SSL HTTPS連接器,也可能不啟用。如果使用Tomcat服務(wù)器,那么就沒有配置SSL連接器。本節(jié)描述如何為Tomcat配置SSL HTTPS連接器。如果使用其他Web服務(wù)器,則應(yīng)該參考相應(yīng)服務(wù)器的文檔。
在部署描述符中必須包含一個(gè)用于SSL連接的元素Connector。在改變服務(wù)器部署描述符之前,必須關(guān)閉服務(wù)器。下列代碼是在Web服務(wù)器上啟用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>
這個(gè)Connector元素的屬性在附錄A Tomcat服務(wù)器管理工具中有更詳細(xì)的描述。可以使用下面兩種方法之一向Tomcat添加SSL HTTPS連接器:
· 使用admintool添加Connector。參見在admintool中添加SSL連接器。
· 向服務(wù)器的部署描述符添加SSL連接器的Connector元素。參見在server.xml中配置SSL。
在admintool中添加SSL連接器
要用admintool配置SSL連接器,必須首先像在設(shè)置數(shù)字證書中所描述的那樣創(chuàng)建一個(gè)keystore。Tomcat會(huì)在它所運(yùn)行的計(jì)算機(jī)上的主目錄中尋找名為.keystore的keystore。確認(rèn)已經(jīng)創(chuàng)建了keystore以后,進(jìn)行以下步驟:
1. 如果Tomcat還沒有啟動(dòng),就啟動(dòng)它。
2. 在Web瀏覽器中輸入http://localhost:8080/admin in a Web browser啟動(dòng)admintool。
3. 輸入為admin角色指定的用戶名和密碼組合。
4. 在左邊窗格中選擇服務(wù)(Java Web Services Developer Pack)。
5. 從右邊窗格中的下拉列表中選擇Create New Connector。
6. 在Type域,選擇HTTPS。
7. 在Port域,輸入8443(或者其他所要求的端口)。這會(huì)定義Tomcat會(huì)監(jiān)聽哪個(gè)安全連接的TCP.IP端口號(hào)。
8. 如果創(chuàng)建了keystore,其名字不是.keystore,如果keystore不在Tomcat所運(yùn)行的計(jì)算機(jī)上的home目錄中,或者密碼不是默認(rèn)值changeit,則輸入Keystore Name和keystore Password。如果使用了期望值,則可以不填寫這些域。
在Unix和Linux系統(tǒng)中home目錄是/home/user_name,在Microsoft Windows系統(tǒng)中是C:\Documents and Settings\user_name。
9. 選擇Save以為該會(huì)話保存新Connector。
10. 選擇Commit Changes以將新Connector信息寫入文件server.xml,這樣下次Tomat啟動(dòng)時(shí)它就是可用的了。
要查看和/或者編輯新創(chuàng)建的Connector,展開Service(Java Web Services Developer Pack)節(jié)點(diǎn),并選擇Connector(8443)。
在server.xml中配置SSL Connector
在默認(rèn)server.xml中包括了一個(gè)SSL Connector的示例Connector元素。在默認(rèn)情況下這個(gè)Connector元素是注釋掉的。要為Tomcat啟用SSL Connector,去掉圍繞著SSL Connector元素的注釋標(biāo)記。為此,執(zhí)行以下步驟。
1. 如果Tomcat正在運(yùn)行,則關(guān)閉它。當(dāng)Tomcat再次啟動(dòng)時(shí)對<JWSDP_HOME>/conf/server.xml文件的修改就可被它使用了。
2. 在文本編輯器中打開文件<JWSDP_HOME>/conf/server.xml。
3. 在文件中找到下代碼部分(可以試著搜索SSL Connector)。刪除圍繞Connector項(xiàng)的注釋。要?jiǎng)h除的注釋標(biāo)簽以粗體表示。
<!-- 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. 保存并關(guān)閉文件。
5. 啟動(dòng)Tomcat。
在Tomcat管理工具文檔中對這個(gè)Connector元素中的屬性有更詳細(xì)的描述。
驗(yàn)證SSL支持
為了進(jìn)行測試,并驗(yàn)證SSL支持已經(jīng)正確安裝,用連接到在服務(wù)器部署描述符中定義的端口的URL裝載默認(rèn)的介紹頁面:
https://localhost:8443/
這個(gè)URL中的https表明瀏覽器應(yīng)該使用SSL協(xié)議。端口8443就是在前面一步中創(chuàng)建SSL Connector的端口
用戶第一次裝載這個(gè)應(yīng)用程序時(shí),會(huì)顯示New Site Certificate對話框。選擇Next通過一系列New Site Certificate對話框,到達(dá)最后一個(gè)對話框時(shí),選擇Finish。
有關(guān)運(yùn)行SSL的一般性提示
SSL協(xié)議設(shè)計(jì)為盡可能地高效和安全。不過,從性能的角度看,加密/解密是一種需要大量計(jì)算的過程。不一定要將整個(gè)Web應(yīng)用都放到SSL上,并且一般由開發(fā)者決定哪一頁面需要安全連接,哪一頁面不需要。可能需要安全連接的頁面包括登錄頁面、個(gè)人信息頁面、購物小車付款、或者任何其他可能傳送信用卡號(hào)的頁面。可以僅通過加在地址上用https個(gè)取代http前綴而使應(yīng)用程序中的任何一頁面運(yùn)行在安全套接字上。對任何絕對要求安全連接的頁面都應(yīng)該檢查與該頁面請求相關(guān)聯(lián)的協(xié)議類型,如果沒有指定https就要采取相應(yīng)措施。
使用在安全連接上的基于名字的虛擬主機(jī)可能會(huì)有問題。這是SSL協(xié)議本身的一個(gè)設(shè)計(jì)局限。SSL握手必須在訪問HTTP請求之前發(fā)生,在握手時(shí)客戶端瀏覽器接受服務(wù)器證書。結(jié)果,不能在身份驗(yàn)證之前確定包含虛擬主機(jī)名的請求信息,并且因此不可能對一個(gè)IP地址指定多個(gè)證書。如果在一個(gè)IP地址上的所有虛擬主機(jī)需要針對同一個(gè)證書進(jìn)行驗(yàn)證,那么額外的多個(gè)虛擬主機(jī)就不應(yīng)該介入服務(wù)器上的普通SSL操作。不過要知道,大多數(shù)客戶端瀏覽器會(huì)比較服務(wù)器的域名和在證書中列出的域名,如果有列出的話(主要適用于正式的、CA簽名的證書)。如果域名不匹配,那么這些瀏覽器將向客戶端顯示一個(gè)警告。一般來說,在生產(chǎn)環(huán)境中只有基于地址的虛擬主機(jī)通常會(huì)使用SSL。
SSL連接的故障排除
啟動(dòng)Tomcat時(shí),得到這樣的異常“"java.io.FileNotFoundException: {some-directory}/{some-file} not found”
一個(gè)可能的解釋是Tomcat不能找到它要尋找的keystore文件。在默認(rèn)情況下,Tomcat期待keystore命名為.keystore,并且位于Tomcat所在的系統(tǒng)中的home目錄(與您自己的計(jì)算機(jī)上的home目錄可能一致、也可能不一致) 。如果keystore文件是在其他位置,那么就需要在Tomcat配置文件中的<Factory>元素上添加一個(gè)keystoreFile屬性,或者在admintool的Connector (8443)節(jié)點(diǎn)指定文件的位置。
Tomcat啟動(dòng)時(shí),得到這樣的異常“"java.io.FileNotFoundException: Keystore was tampered with, or password was incorrect”。
假設(shè)沒有人改變了您的keystore文件,最有可能的原因是Tomcat使用了與創(chuàng)建keystore文件時(shí)使用的不同的密碼。要解決這個(gè)問題,可以返回并重新創(chuàng)建keystore文件,也可以在Tomcat配置文件中的<Factory>元素上、或者在的Connector (8443)節(jié)點(diǎn)上添加keystorePass屬性——提醒--密碼是大小寫敏感的。
如果仍然有問題,
如果仍然有問題,郵件列表是一個(gè)好的信息資源。可以在http://jakarta.apache.org/site/mail.html上查看這個(gè)列表中以前的消息,還可以預(yù)訂和取消預(yù)訂信息。
有關(guān)SSL的進(jìn)一步信息
更多信息請參閱<JWSDP_HOME>/docs/tomcat/ssl-howto.html上的Tomcat文檔SSL Configuration HOW-TO。
JAX-RPC的安全性
在本節(jié),將學(xué)習(xí)如何配置基于JAX-RPC的Web服務(wù)應(yīng)用程序以進(jìn)行HTTP/SSL上的基本和相互身份驗(yàn)證。如果驗(yàn)證對于您來說還是一個(gè)新題目,那么請參見驗(yàn)證Web資源的用戶那一節(jié)。
在本教程中,我們要修改<JWSDP_HOME>/docs/tutorial/examples/jaxrpc/hello中的示例應(yīng)用程序以添加HTTP/S基本和相互身份驗(yàn)證。可以在目錄<JWSDP_HOME>/docs/tutorial/examples/jaxrpc/security中找到所得到的應(yīng)用程序。下列步驟是向hello例子中添加基本驗(yàn)證的必要步驟:
· 創(chuàng)建相應(yīng)的證書和keystore(參見第1步:為基本身份驗(yàn)證創(chuàng)建SSL證書)。
· 確保為服務(wù)器配置了SSL 連接器。Tomcat服務(wù)器沒有配置SSL Connector,所以需要添加SSL Connector(參見配置SSL連接器)并在生成的keystore文件中添加信息(見第2步:配置SSL 連接器)。
· .向部署描述符web.xml添加安全元素。有關(guān)操作信息參見第3步:向web.xml添加安全元素。
· 在應(yīng)用程序的build.properties文件中修改端點(diǎn)地址,并添加運(yùn)行這個(gè)例子所需要的其他屬性。參見第4步:編輯Build屬性。
· 在客戶端代碼中設(shè)置安全屬性。有關(guān)操作信息參見第5步:在客戶端代碼中設(shè)置安全屬性。
· 編譯并運(yùn)行Web服務(wù)。有關(guān)對示例應(yīng)用程序完成這項(xiàng)操作的信息見第6步:創(chuàng)建NewAnt Target以運(yùn)行這個(gè)例子。
在這里描述為Web服務(wù)配置HTTP/S上的基本身份驗(yàn)證的步驟。對于相互身份驗(yàn)證,完成下述步驟,再按啟用SSL上的相互驗(yàn)證中的說明添加客戶端驗(yàn)證。
第1步:為基本身份驗(yàn)證創(chuàng)建SSL證書
注:在設(shè)置數(shù)字證書中對這些信息有更詳細(xì)的討論。本節(jié)總結(jié)了為這個(gè)例子創(chuàng)建SSL證書所需要的步驟。
我們將用工具keytool生成SSL證書并將它們導(dǎo)出為相應(yīng)的服務(wù)器和客戶端keystore。記住服務(wù)器和客戶端keystore是在運(yùn)行keytool的目錄中創(chuàng)建的。因?yàn)槲覀兪窍騢ello Web服務(wù)添加安全性,所以我們從修改的示例應(yīng)用程序所在目錄中運(yùn)行keytool,這就是<JWSDP_HOME>/docs/tutorial/examples/jaxrpc/security目錄。這樣,keystore就在security Web服務(wù)的代碼所在的同一目錄中生成。
1. 運(yùn)行keytool以生成服務(wù)器和客戶端keystore。對于基本身份驗(yàn)證,只需要將服務(wù)器證書導(dǎo)入到客戶端keystore。用默認(rèn)密碼changeit生成服務(wù)器keystore。
要生成服務(wù)keystore,在終端窗口輸入下面內(nèi)容。在繼續(xù)之前確是在<JWSDP_HOME>/docs/tutorial/examples/jaxrpc/security目錄中。
注意在按Enter時(shí),keytool提示您輸入服務(wù)器名、組織單位、組織、所在地、州和國家代碼。注意必須在keytool的要求輸入姓和名的第一個(gè)提示中輸入服務(wù)器名。為了進(jìn)行測試,可以用localhost。這個(gè)主機(jī)必須與在第4步:編輯Build屬性中指定的端點(diǎn)地址中標(biāo)識(shí)的主機(jī)相匹配。
<J2SE_HOME>\bin\keytool -genkey
-alias tomcat-server
-keyalg RSA -keypass changeit
-storepass changeit
-keystore server.keystore
2. 導(dǎo)出生成的服務(wù)器證書。
<J2SE_HOME>\bin\keytool -export -alias tomcat-server
-storepass changeit -file server.cer -keystore
server.keystore
3. 生成客戶端keystore。
要生成客戶端keystore,在終端窗口中輸入以下內(nèi)容:
注意在按Enter時(shí),keytool提示您輸入客戶端的服務(wù)器名、組織單位、組織、所在地、州和國家代碼。注意必須在keytool的要求輸入姓和名的第一個(gè)提示中輸入服務(wù)器名。在大多數(shù)情況下,為了進(jìn)行測試,可以使用localhost。這個(gè)主機(jī)必須與在第4步:編輯Build屬性中指定的端點(diǎn)地址中標(biāo)識(shí)的主機(jī)相匹配。
<J2SE_HOME>\bin\keytool -genkey -alias jwsdp-client -keyalg
RSA -keypass changeit -storepass changeit -keystore
client.keystore
4. 將服務(wù)器證書導(dǎo)入客戶端的keystore。
<J2SE_HOME>\bin\keytool -import -v -trustcacerts
-alias tomcat-server -file server.cer
-keystore client.keystore -keypass changeit
-storepass changeit
第2步:配置SSL連接器
注:在配置SSL 連接器一節(jié)中更詳細(xì)地提供了配置SSL 連接器的步驟。本節(jié)中的步驟是為了您的方便提供的。
需要為Tomcat配置一個(gè)SSL Connector。如果使用不同的服務(wù)器,參見配置SSL 連接器中配置SSL Connector的一般信息。除了為服務(wù)配置一個(gè)SSL 連接器外,還必須在添加SSL連接器的同一位置上添加有關(guān)keystore文件的信息及其密碼。例如,在Java WSDP中,首先需要從SSL Connector周圍刪除注釋標(biāo)簽(<!-- ... -->),然后在<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添加安全元素
這個(gè)例子的文件在<JWSDP_HOME>/docs/tutorial/examples/jaxrpc/security目錄中。要通過SSL進(jìn)行身份驗(yàn)證,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,這是一個(gè)已經(jīng)在Tomcat的部署描述符(<JWSDP_HOME>/conf/tomcat-users.xml)中指定的角色。有關(guān)角色定義和鏈接的更多內(nèi)容,參見安全性角色。
第4步:編輯Build屬性
要以HTTP/SSL上的基本身份驗(yàn)證運(yùn)行這個(gè)應(yīng)用程序,我們向build.properties文件添加與keystore文件相關(guān)的一些屬性及其密碼,這個(gè)文件位于<JWSDP_HOME>/docs/tutorial/examples/jaxrpc/security目錄中。下述例子假設(shè)運(yùn)行的是Java WSDP 1.1。以粗體標(biāo)記的項(xiàng)被添加到文件中。在后面一節(jié)中運(yùn)行它時(shí),所添加的項(xiàng)將作為參數(shù)傳遞給客戶端應(yīng)用程序。
# This file is referenced by the build.xml file.
example=security
context-path=security-jaxrpcclient-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步:在客戶端代碼中設(shè)置安全屬性
客戶端的源代碼在<JWSDP_HOME>/docs/tutorial/examples/jaxrpc/security目錄中的HelloClient.java文件中。對于SSL上的基本身份驗(yàn)證,客戶端代碼必須設(shè)置幾項(xiàng)安全相關(guān)的屬性。
· trust-store屬性——trust-store屬性的值是客戶端 keystore文件的完全限定名:<JWSDP_HOME>/docs/tutorial/examples/jaxrpc/security/client.keystore
· trust-store-password屬性——trust-store-password屬性是keystore的密碼。這個(gè)密碼的默認(rèn)值是changeit。
· username和 password屬性——username和password屬性對應(yīng)于manager角色(見安全性角色)。
客戶端如下設(shè)置前述的安全屬性。粗體的代碼是在原來的jaxrpc/hello示例應(yīng)用程序上添加的代碼。
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 步:創(chuàng)建New Ant Target以運(yùn)行這個(gè)例子
運(yùn)行hello示例應(yīng)用程序的現(xiàn)有目標(biāo)還不足以運(yùn)行運(yùn)行安全版本的應(yīng)用程序。需要傳遞關(guān)于keystore及其密碼的信息,以及用戶名及用戶密碼。下列targe添加到<JWSDP_HOME>/docs/examples/jaxrpc/security/build.xml文件中,以便于運(yùn)行安全的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步:編譯并運(yùn)行這個(gè)例子
要編譯并在SSL上運(yùn)行這個(gè)JAX-RPC例子,執(zhí)行以下步驟:
1. 如果沒有做的話,按照設(shè)置中的指示,下載本教程的示例代碼,完成上述第1到2步,因?yàn)檫@些步驟是對您的計(jì)算機(jī)和實(shí)現(xiàn)特定的。
2. 確保Tomcat正在運(yùn)行。
3. 進(jìn)入<JWSDP_HOME>/docs/tutorial/examples/jaxrpc/security目錄。
4. 鍵入下述命令:
ant build
ant package
ant deploy
ant build-static
ant run-security
客戶端應(yīng)該顯示下述輸出:
% 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上的相互身份驗(yàn)證
TJAX-RPC安全性一節(jié)對設(shè)置服務(wù)器端身份驗(yàn)證進(jìn)行了討論。本節(jié)討論設(shè)置客戶端身份驗(yàn)證。當(dāng)服務(wù)器和客戶端身份驗(yàn)證都啟用時(shí),這稱為相互、或者雙向驗(yàn)證。在客戶端身份驗(yàn)證中,客戶端需要提交由你所選擇的可以接受的證書頒發(fā)機(jī)構(gòu)頒發(fā)的證書。至少有兩種途徑啟用客戶端身份驗(yàn)證。
1. .配置SSL套接字工廠啟用客戶端驗(yàn)證。例如,要為Tomcat配置SSL套接字工廠 ,要設(shè)置clientAuth="true",如下面代碼示例中的粗體部分。以這種方式啟用客戶端驗(yàn)證,對于所有通過特定SSL端口進(jìn)入的請求都會(huì)要求客戶端驗(yàn)證。與對Web服務(wù)配置文件所做的所有改變一樣,必須停止并重新啟動(dòng)Web服務(wù)以使這種改變生效。
<!-- 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. 如下面粗體部分所示。以這種方法啟用客戶端身份驗(yàn)證,客戶端身份驗(yàn)證是對特定的應(yīng)用程序啟用的。
<login-config>
<auth-method>CLIENT-CERT</auth-method>
</login-config>
3. 如果同時(shí)用上述兩種方法啟用客戶端身份驗(yàn)證,那么客戶端身份驗(yàn)證將會(huì)執(zhí)行兩次。
為JAX-RPC安全示例配置相互驗(yàn)證
要以相互驗(yàn)證配置并創(chuàng)建JAX-PRC服務(wù),執(zhí)行JAX-RPC安全性中的所有步驟,直到ant build-static命令 (包括這一步)。然后執(zhí)行以下步驟:
1. 生成客戶端證書,導(dǎo)出它,再將客戶端證書導(dǎo)入服務(wù)器keystore,如為相互驗(yàn)證創(chuàng)建客戶端證書中所討論的。
2. 編輯web.xml以將部署描述符中的登錄配置部分的身份驗(yàn)證方法改為CLIENT-CERT。
<login-config>
<auth-method>CLIENT-CERT</auth-method>
</login-config>
3. :運(yùn)行這個(gè)應(yīng)用程序:
ant run-security
客戶端應(yīng)該顯示以下一行:
Hello Duke! I feel secure!
致謝:本節(jié)包括由Rahul Sharma和Beth Stearns編寫的“Web Services Security Configuration”白皮書中的內(nèi)容。
EIS層安全性
在EIS層,應(yīng)用程序組件請求到EIS資源的連接。作為這種連接的一部分,EIS可能請求對資源的sign-on。應(yīng)用程序組件提供者有兩設(shè)計(jì)這種EIS sign-on的選擇:
· 使用容器托管的sign-on方式,應(yīng)用程序組件讓容器負(fù)責(zé)配置并管理EIS sign-on。容器確定用戶名和密碼以建立到EIS實(shí)例的連接。
· 用組件托管的sign-on方式,應(yīng)用程序組件代碼通過加入執(zhí)行sign-on過程的代碼管理EIS sign-on。
容器托管的登錄(Sign-On)
使用容器托管的登錄,應(yīng)用程序組件不必為了登錄資源而向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();
...
組件托管的登錄
使用組件管理的登錄,應(yīng)用程序組件負(fù)責(zé)向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);
...
posted on 2007-05-21 09:00 junky 閱讀(847) 評(píng)論(0) 編輯 收藏 所屬分類: security