筆者:何鋼
一、
配置環境
1.1?
tomcat
簡介
tomcat
是
apache jakarta
的子項目之一,作為一個優秀的開源
web
應用服務器,全面支持
jsp1.2
以及
servlet2.3
規范。因其技術先進、性能穩定,而且免費,因而深受
java
愛好者的喜愛并得到了部分軟件開發商的認可,成為目前比較流行的
web
應用服務器。
1.2?
ssl(server socket layer)
簡介
在網絡上信息在源
-
宿的傳遞過程中會經過其它的計算機。一般情況下,中間的計算機不會監聽路過的信息。但在使用網上銀行或者進行信用卡交易的時候有可能被監視,從而導致個人隱私的泄露。由于
internet
和
intranet
體系結構的原因,總有某些人能夠讀取并替換用戶發出的信息。隨著網上支付的不斷發展,人們對信息安全的要求越來越高。因此
netscape
公司提出了
ssl
協議,旨在達到在開放網絡
(internet)
上安全保密地傳輸信息的目的,這種協議在
web
上獲得了廣泛的應用。
之后
ietf(www.ietf.org)
對
ssl
作了標準化,即
rfc2246
,并將其稱為
tls
(
transport layer security
),從技術上講,
tls1.0
與
ssl3.0
.3? ssl
工作原理
ssl協議使用不對稱加密技術實現會話雙方之間信息的安全傳遞。可以實現信息傳遞的保密性、完整性,并且會話雙方能鑒別對方身份。不同于常用的http協議,我們在與網站建立ssl安全連接時使用https協議,即采用https://ip:port/的方式來訪問。
當我們與一個網站建立https連接時,我們的瀏覽器與web server之間要經過一個握手的過程來完成身份鑒定與密鑰交換,從而建立安全連接。具體過程如下:
-
用戶瀏覽器將其
ssl
版本號、加密設置參數、與
session
有關的數據以及其它一些必要信息發送到服務器。
-
服務器將其
ssl
版本號、加密設置參數、與
session
有關的數據以及其它一些必要信息發送給瀏覽器,同時發給瀏覽器的還有服務器的證書。如果配置服務器的
ssl
需要驗證用戶身份,還要發出請求要求瀏覽器提供用戶證書。
-
客戶端檢查服務器證書,如果檢查失敗,提示不能建立
ssl
連接。如果成功,那么繼續。
-
客戶端瀏覽器為本次會話生成
pre-master secret
,并將其用服務器公鑰加密后發送給服務器。
-
如果服務器要求鑒別客戶身份,客戶端還要再對另外一些數據簽名后并將其與客戶端證書一起發送給服務器。
-
如果服務器要求鑒別客戶身份,則檢查簽署客戶證書的
ca
是否可信。如果不在信任列表中,結束本次會話。如果檢查通過,服務器用自己的私鑰解密收到的
pre-master secret
,并用它通過某些算法生成本次會話的
master secret
。
-
客戶端與服務器均使用此
master secret
生成本次會話的會話密鑰
(
對稱密鑰
)
。在雙方
ssl
握手結束后傳遞任何消息均使用此會話密鑰。這樣做的主要原因是對稱加密比非對稱加密的運算量低一個數量級以上,能夠顯著提高雙方會話時的運算速度。
-
客戶端通知服務器此后發送的消息都使用這個會話密鑰進行加密。并通知服務器客戶端已經完成本次
ssl
握手。
-
服務器通知客戶端此后發送的消息都使用這個會話密鑰進行加密。并通知客戶端服務器已經完成本次
ssl
握手。
-
本次握手過程結束,會話已經建立。雙方使用同一個會話密鑰分別對發送以及接受的信息進行加、解密。
1.4?
所需軟件包
-
tomcat 4.0.2
用途:
web server
。
下載:
http://jakarta.apache.org/builds/jakarta-tomcat-4.0/release/v4.0.3/bin/
-
jsse 1.0,2
用途:用來產生
tocmcat
使用的秘鑰對
(keystore)
。
下載:
http://java.sun.com/products/jsse/
-
openssl 0.9.9.6 用途:用來產生ca證書、簽名并生成ie可導入的pkcs#12格式私鑰。
下載:
http://www.openssl.org/
-
genrsa
[
產生密鑰命令
]
╟out
[
密鑰文件輸出路徑
]
1024 [
密鑰位數
]
3.
生成待簽名的證書
openssl req -new -out mageca/ca-req.csr -key mageca/ca-key.pem
req[
產生證書命令
]-new[
新生成
]-out[
證書文件輸出路徑
]-key[
私鑰文件路徑]
4.
用
ca
私鑰自簽名
二?
???????????
配置步驟
2.1?
建立自己的
ca
證書
1.
在
openssl
的
apps
目錄下建立自己的
ca
目錄,例如:
mageca
mkdir mageca
2.
生成
ca
密鑰
openssl genrsa -out mageca/ca-key.pem 1024
-
openssl x509 -req -in mageca/ca-req.csr -out mageca/ca-cert.pem -signkey mageca/ca-key.pem -days 365
-
x509[
簽發
x509
證書命令]
-req[
輸入待簽發證書
]-in[
輸入待簽發證書文件路徑
]-out[
產生
x509
證書文件輸出路徑
]-signkey[
自簽發密鑰文件路徑
]-days
[證書有效期
]╟ca
[簽發跟證書
]-cakey[
根證書密鑰文件
] ╟cacreateserial[
創建序列號
]
?
[
注
]
將自動生成的
ca-key.srl
文件拷貝到創建的
ca
目錄下
.
。
?
2.2?
配置
tomcat 4.x
?
2.2.1?
?????
建立服務器證書
?
[
注
]
在本文中用符號
"%jdk_home%"
來表示
jdk
的安裝位置,用符號
"%tcat_home%"
表示
tomcat
的安裝位置。
?
1.
???????
建立工作目錄
?
在
%jdk_home%
的
bin
目錄下建立自己的
server
目錄,例如:
server
?
mkdir server
?
2.
???????
生成
server
密鑰對
?
%jdk_home%
/bin/keytool -genkey -alias tomcat_server -validity 365 -keyalg rsa -keysize 1024 -keypass changeit -storepass changeit -dname "cn=localhost, ou=department, o=company, l=beijing, st=beijing, c=cn" -keystore server/server_keystore
?
?-genkey[
產生密鑰對
]-alias[
密鑰對別名
]-validity[
密鑰有效期
]-keyalg[
密鑰算法參數
]-keysize[
密鑰位數
]-keypass[
密鑰保護密碼
]-storepass[
存儲密碼
]-dname[
別名相關附加信息
]-keystore[
密鑰存儲文件路徑
]
?
[
注
]? -alias
后的
tomcat_server
是密鑰對的名字可替換為自己需要的名字;
-keypass
與
-storepass
后的
changeit
為保護密碼必須
6
位,將其替換為你的密碼即可;
-dname
為包含的
server
信息。其中
cn
是服務器的名字一定要與
web
服務器中設置的一樣。
3.
???????
生成待簽名證書
%jdk_home%
/bin/keytool -certreq -alias tomcat_server -sigalg md5withrsa -file server/server.csr -keypass changeit -keystore server/server_keystore -storepass changeit
-certreq[
產生待簽名證書
]-alias[
證書別名
]-sigalg[
證書算法參數
]-file [
產生文件輸出路徑
]-keypass[
密鑰保護密碼
]-keystore[
存儲文件路徑
]-storepass[
存儲密碼]
4.
???????
用
ca
私鑰簽名
openssl x509 -req -in server/server.csr -out server/server-cert.pem -ca mageca/ca-cert.pem -cakey mageca/ca-key.pem -days 365
[注]
先將生成的
server.csr
文件
ftp
到
linux
上
openssl
的目錄下的
server
子目錄中,
ftp
的傳輸模式應設為
bin
模式,以下同。
2.2.2?
?????
將
ca
根證書和服務器證書導入
tomcat
1.
???????
導入
ca
根證書
將
ca
根證書(
ca-cert.pem
)
ftp
到
java
工作目錄下的
ca
子目錄中
%jdk_home%/bin/keytool -import -v -trustcacerts -storepass changeit -alias my_ca_root -file ca/ca-cert.pem -keystore %jdk_home%/jre/lib/security/cacerts
-import[
導入命令
]-v ╟trustcacerts[
導入信任證書
] ╟storepass[
存儲密碼
]-alias[
證書別名
]-file[
證書文件路徑
]-keystore[
導入文件路徑
]
[
注
]
此處的
-storepass
為默認的“
changeit
”。
-alias
為
ca
根證書的別名。
2.
???????
導入服務器證書
將服務器證書(
server-cert.pem
)
ftp
到
java
工作目錄下的
server
子目錄中。
%jdk_home%/bin/keytool -import -v -trustcacerts -storepass changeit -alias tomcat_server -file server/server-cert.pem -keystore server/server_keystore
[
注
]
此時的
-storepass
為生成證書時輸入密碼。
-alias
為服務器證書的別名。
3.
???????
查看證書
查看ca證書
keytool -list -keystore %jdk_home%/jre/lib/security/cacerts
查看服務器證書
keytool -list -keystore server/server_keystore
2.2.3?
?????
修改
tomcat
的配置文件
修改
conf
目錄下
server.xml
文件找到以下內容去掉其注釋并修改。
<!-- define an ssl http/1.1 connector on port 8443 -->
??? <connector classname="org.apache.catalina.connector.http.httpconnector"
?????????????? port="8443" minprocessors="5" maxprocessors="75"
?????????????? enablelookups="false"
??????
?????? acceptcount="10" debug="0" scheme="https" secure="true">
????? <factory classname="org.apache.catalina.net.sslserversocketfactory"
?????????????? clientauth="true" protocol="tls"
keystorefile="c:/jakarta-tomcat-4.0-b1/conf/server_keystore" keystorepass="780608"
/>
??? </connector>
然后把文件
server/ server_keystore
復制到目錄
%tcat_home%\conf\
下
2.3?
配置
ie
客戶端
2.3.1?
?????
建立
client
證書
1.
???????
?openssl
的
apps
目錄下建立自己的
client
目錄,例如:
client
2.
?????????????????
生成
client
密鑰對
openssl genrsa -out client/ client ╟key.pem 1024
3.
?????????????????
生成待簽名的證書
openssl req -new -out client/ client-req.csr -key client/ client-key.pem
4.
?????????????????
用
ca
私鑰簽名
openssl x509 -req -in client/client-req.csr -out client/client-cert.pem -signkey c lient/client-key.pem -ca ca/ca-cert.pem -cakey ca/ca-key.pem -cacreateserial -days 365
5.
?????????????????
生成
client
端可以導入的個人證書
openssl pkcs12 -export -clcerts -in client/client-cert.pem -inkey client/client-key.pem -out client/client.p12
pkcs12[
生成pks12格式證書命令
]-export[
導出文件
]-clerts[
僅導出client證書
]-in[
輸入的client證書文件路徑
]-inkey[
client證書密鑰文件路徑
]-out[
導出pks12格式文件路徑]
2.3.2?
?????
將
ca
證書與
client
證書導入
ie
1.
???????
導入
ca
根證書
將已經
ftp
到
java
工作目錄下
ca
子目錄中的
ca-cert.pem
改名為
ca-cert.cer
;
在
client
端的
ie
中使用
<
工具
>,< internet
選項
>,<
內容
>,<
證書
>,<
導入
>,
把我們生成的
ca
根證書導入,使其成為用戶信任的
ca
。
2.
???????
導入
client
證書
將
client
證書(
client.p12
)
ftp
到
client
端,把
client.p12
導入到
client
端的
ie
中作為
client
證書,導入過程同上
三?
???????????
用
ie
瀏覽器使用
ssl
協議訪問
tomcat
1.
???????
執行
%tcat_home%/bin/startup.bat
啟動
tomcat 4.x
;
2.
???????
在
ie
瀏覽器的地址欄中輸入
https://localhost:8443
,如果前面的操作都正確,應該可以看到
tomcat
的歡迎頁面。同時狀態欄上的小鎖處于閉合狀態,表示您已經成功地與服務器建立了要求客戶端驗證的
ssl
安全連接。
?