tomcat實現(xiàn)SSL雙向認證
一、基礎(chǔ)知識Tomcat 簡介Tomcat 是Apache Jakarta 的子項目之一,作為一個優(yōu)秀的開源web 應(yīng)用服務(wù)器,全面支持jsp1.2以及servlet2.3規(guī)范。因其技術(shù)先進、性能穩(wěn)定
一、基礎(chǔ)知識
Tomcat 簡介
Tomcat 是Apache Jakarta 的子項目之一,作為一個優(yōu)秀的開源web 應(yīng)用服務(wù)器,全面支持jsp1.2以及servlet2.3規(guī)范。因其技術(shù)先進、性能穩(wěn)定,而且免費,因而深受Java 愛好者的喜愛并得到了部分軟件開發(fā)商的認可,成為目前比較流行的web 應(yīng)用服務(wù)器。
用于對數(shù)據(jù)進行壓縮和解壓操作,并返回網(wǎng)絡(luò)上傳送回的結(jié)果。HTTPS 實際上應(yīng)用了Netscape 的完全套接字層(SSL )作為HTTP 應(yīng)用層的子層。(HTTPS 使用端口443,而不是象HTTP 那樣使用端口80來和TCP/IP進行通信。)SSL 使用40 位關(guān)鍵字作為RC4流加密算法,這對于商業(yè)信息的加密是合適的。HTTPS 和SSL 支持使用X.509數(shù)字認證,如果需要的話用戶可以確認發(fā)送者是誰。。
SSL (Secure Socket Layer)簡介
為Netscape 所研發(fā),用以保障在Internet 上數(shù)據(jù)傳輸之安全,利用數(shù)據(jù)加密(Encryption)技術(shù),可確保數(shù)據(jù)在網(wǎng)絡(luò)上之傳輸過程中不會被截取及竊聽。
(附)SSL 工作原理
SSL 協(xié)議使用不對稱加密技術(shù)實現(xiàn)會話雙方之間信息的安全傳遞。可以實現(xiàn)信息傳遞的保密性、完整性,并且會話雙方能鑒別對方身份。不同于常用的http 協(xié)議,我們在與網(wǎng)站建立SSL 安全連接時使用https 協(xié)議,即采用的方式來訪問。
當我們與一個網(wǎng)站建立https 連接時,我們的瀏覽器與Web Server之間要經(jīng)過一個握手的過程來完成身份鑒定與密鑰交換,從而建立安全連接。具體過程如下:
1. 用戶瀏覽器將其SSL 版本號、加密設(shè)置參數(shù)、與session 有關(guān)的數(shù)據(jù)以及其它一些必要信息發(fā)送到服務(wù)器。
2. 服務(wù)器將其SSL 版本號、加密設(shè)置參數(shù)、與session 有關(guān)的數(shù)據(jù)以及其它一些必要信息發(fā)送給瀏覽器,同時發(fā)給瀏覽器的還有服務(wù)器的證書。如果配置服務(wù)器的SSL 需要驗證用戶身份,還要發(fā)出請求要求瀏覽器提供用戶證書。
3. 客戶端檢查服務(wù)器證書,如果檢查失敗,提示不能建立SSL 連接。如果成功,那么繼續(xù)。
4. 客戶端瀏覽器為本次會話生成pre-master secret ,并將其用服務(wù)器公鑰加密后發(fā)送給服務(wù)器。
,5. 如果服務(wù)器要求鑒別客戶身份,客戶端還要再對另外一些數(shù)據(jù)簽名后并將其與客戶端證書一起發(fā)送給服務(wù)器。
6. 如果服務(wù)器要求鑒別客戶身份,則檢查簽署客戶證書的CA 是否可信。如果不在信任列表中,結(jié)束本次會話。如果檢查通過,服務(wù)器用自己的私鑰解密收到的pre-master secret ,并用它通過某些算法生成本次會話的master secret。
7. 客戶端與服務(wù)器均使用此master secret生成本次會話的會話密鑰(對稱密鑰) 。在雙方SSL 握手結(jié)束后傳遞任何消息均使用此會話密鑰。這樣做的主要原因是對稱加密比非對稱加密的運算量低一個數(shù)量級以上,能夠顯著提高雙方會話時的運算速度。
8. 客戶端通知服務(wù)器此后發(fā)送的消息都使用這個會話密鑰進行加密。并通知服務(wù)器客戶端已經(jīng)完成本次SSL 握手。
9. 服務(wù)器通知客戶端此后發(fā)送的消息都使用這個會話密鑰進行加密。并通知客戶端服務(wù)器已經(jīng)完成本次SSL 握手。
10. 本次握手過程結(jié)束,會話已經(jīng)建立。雙方使用同一個會話密鑰分別對發(fā)送以及接受的信息進行加、解密。
二、tomcat 實現(xiàn)SSL 配置
第一步 生成KeyStore
keytool -genkey -alias tomcat -keyalg RSA –keysize 1024 –validity 730 -keystore D:server.keystore
生成.keystore 文件在 用戶目錄下
輸入keystore 密碼: ************
您的名字與姓氏是什么?
[Unknown]: localhost
您的組織單位名稱是什么?
[Unknown]: dept
您的組織名稱是什么?
[Unknown]: Inc
您所在的城市或區(qū)域名稱是什么?
[Unknown]: bj
您所在的州或省份名稱是什么?
[Unknown]: bj
該單位的兩字母國家代碼是什么
[Unknown]: CN
CN=localhost, OU= dept, O= Inc, L=bj, ST=bj, C=CN 正確嗎?
[否]: Y
輸入的主密碼
(如果和 keystore 密碼相同,按回車):*************
注意: localhost ,是網(wǎng)站的域名或者ip, 根據(jù)實際情況填寫,比如 www.baidu.com 192.168.0.85 否則會出現(xiàn)證書上的名稱無效,或者與站點名稱不匹配。
,建議:將生成的 server.keystore 文件,放到TOMCAT_HOME或其子目錄中(如:TOMCAT_HOME/conf)
(其實放哪里都一樣,只是放到TOMCAT_HOME里面會方便一些)
第二步 修改server.xml
修改TOMCAT_HOME/conf/server.xml
去掉下面SSL HTTP那個注釋,修改為如下:
Xml 代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
keystoreFile 是server.keystore 放置的位置,keystorePass 是密碼 (默認密碼是changeit)
第三步
重啟Tomcat ,訪問地址https://ip:8443/
,(附錄:)tomcat 的配置文件SSL 部分詳細說明 配置文件server.xml ,SSL 部分:
Xml 代碼
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 56 57 58 59 60 61 62 secure ="true" clientAuth ="false" sslProtocol ="TLS" keystoreFile ="D:/Tomcat/conf/tomcatKey.keystore" keystorePass ="changeit" algorithm ="SunX509" /> 屬性說明: port : 這個port 屬性(默認值是8443) 是 TCP/IP端口數(shù)碼,Tomcat 在其上監(jiān)聽安全連接。你可以把它更改成任何你愿意要的數(shù)值(如默認的https 通信,數(shù)目是443) 。不過,在許多操作系統(tǒng)中,要想在比1024小的端口數(shù)碼上運行Tomcat ,需要特殊的設(shè)置(它超出了這個文檔資料的范圍) 。 redirectPort : 如果你在這里更改端口數(shù)值,你還必須更改在non-SSL 連接器上的redirectPort 這個屬性特定的值。這允許Tomcat 自動地redirect 那些試圖訪問有安全限制頁面的用戶,指明根據(jù) Servlet 2.4 Specification要求,SSL 是必需的 clientAuth : 如果你想要Tomcat 要求所有的SSL 客戶在使用這個socket 時出示用戶認證書,把這個值設(shè)定為 true 。如果你想要Tomcat 要求出示用戶認證書,但是如果沒有認證書也可以, 就把這個值設(shè)定為want 。 keystoreFile : 如果你產(chǎn)生的keystore 文件不在Tomcat 期望的默認地方(一個叫做.keystore 的文件在Tomcat 運行的主目錄) ,就添加這個屬性。你可以指定一個絕對路徑名稱, 或者一個由$CATALINA_BASE環(huán)境變量而派生的相對路徑名稱。 keystorePass : 如果你使用一個不同的keystore(以及認證書) 密碼,而不是Tomcat 期望的密碼 (就是changeit) ,添加這個元素。 keystoreType : 如果使用一個PKCS12 keystore的話,就添加這個element 。 有效的值是JKS 和 PKCS12 sslProtocol : 要在這個socket 上被使用的加密/解密協(xié)定。如果你在使用Sun 的JVM ,我們不提倡更改 這個值。據(jù)報道,TLS 協(xié)定的IBM's 1.4.1 實現(xiàn)與一些通用的瀏覽器不兼容。 如果是這樣,就使用value SSL ciphers : 這個socket 允許使用的由逗號分隔開的加密密碼列單。默認的情況下,任何可用的密碼都允許被使用。 algorithm : 可用的X509算法。默認是Sun 的實現(xiàn)( SunX509 ) 。 對于IBM JVMs ,你應(yīng)該使用值 IbmX509。對于其他賣主,查閱JVM 文檔資料來 找正確的值。 truststoreFile : 用來驗證用戶認證書的TrustStore 文件。 truststorePass : 訪問TrustStore 的密碼。默認值就是keystorePass 的值。 truststoreType : 如果你在使用與KeyStore 不同格式的TrustStore ,添加這個元素。 合法的值是JKS 和PKCS12 keyAlias : 如果 keystore 里面有多個 key ,你可以為用這個選項為加入的 key 起一個名字。 如果沒有指定名字,使用時 keystore 內(nèi)的第一個 key 將會被使用