Linux下Tomcat配置使用SSL雙向認證(使用openssl生成證書)

在安全通訊中,不得不使用ssl,這樣既保證安全,又顯得專業.在看了多篇關於tomcat配置ssl的文章後,本身又總結了一下.我使用的是tomcat6.0,配置起來有些許差異. 

參考網上文章 
Tomcat下雙向SSL安全認證 
Windwos2000下配置Tomcat 5使用SSL 

環境: 
linux magic2.01 
openssl-0.9.8e 
jre1.5.0_05 
apache-tomcat-6.0.13 

本文目錄: 
安裝openssl 
創建ca根證書 
創建server證書 
配置tomcat支持ssl 
創建我的證書 

安裝openssl 
最新版本能夠去www.openssl.org ,我用的是openssl-0.9.8e.tar.gz 
tar -xzf openssl-0.9.8e.tar.gz 
cd openssl-0.9.8e 
./configure --prefix=XXXXX --openssldir=XXXXXXXX 
(這裏prefix是你想安裝openssl的地方, openssldir就是你tar開的openssl源碼的地方。好象全部的出名點的free software都是這個操行,configure, make , make test, make install, 搞定。) 
./make 
./make test 
./make install 
OK, 若是路上沒有什麼問題的話,搞定。 

創建ca根證書 
創建一張證書須要三步,1是生成系統私鑰,2生成待簽名證書,須要輸入一些信息,3 生成x509證書,能夠自已簽名,用來作根證書;也可用其它證書來簽名,生成根證書能夠信任的證書. 

下面是生成根證書 
1生成CA私鑰 

openssl genrsa -out ca/cakey.pem 2048 

[color=red]genrsa[生成CA私鑰] 

-out[生成的私鑰的保存路徑和名字] 

2048[密鑰位數] [/color] 

2 生成待簽名證書 

openssl req -new -out ca/careq.csr -key ca/cakey.pem 

req[生成待簽名證書的選項] 

-key[採用的CA私鑰的路徑] 

3 用CA私鑰進行自簽名 

openssl x509 -req -in ca/careq.csr -out ca/cacert.pem -signkey ca/cakey.pem -days 7200 

4.將證書導出成瀏覽器支持的.p12格式 :

openssl pkcs12 -export -clcerts -in ca/cacert.pem -inkey ca/cakey.pem -out ca/ca.p12


x509[生成x509的CA根證書] 

-in[採用的待簽名證書的路徑] 

-out[生成的CA根證書的路徑] 

-signkey[採用簽名的私鑰的路徑] 

-days[有效時間(天)] 

創建server證書 
由於tomcat爲java的web容器,因此在實現ssl時,要用到java的安全機制,因此部分操做是用java的keytool來完成的. 

1 生成KeyPair 

keytool -genkey -alias tomcat_server -validity 7200 -keyalg RSA -keysize 2048 -keypass 123456 -storepass 123456 -dname " CN=116.114.17.133, OU=vg.group, O=unimassystem.inc, L=hangzhou, ST=zhejiang, C=CN" -keystore server/server_keystore 

-genkey[生成私鑰對的命令] 

-alias[爲生成的私鑰對起個別名] 

-validity[密鑰有效期] 

-keyalg[加密算法] 

-keysize[加密位數] 

-keypass[密鑰保護密碼] 

-storepass[存儲密碼] 

-dname[別名附加的相關信息] 這裏的CN通常要根tomcat服務所在機子的名字同樣,也就是hostname 

-keystore[密鑰存儲文件路徑] 

2 生成待簽名證書 

keytool -certreq -alias tomcat_server -sigalg MD5withRSA -file server/server.csr -keypass 123456 -keystore server/server_keystore -storepass 123456 

-file[生成的待簽名證書的路徑] 

3 用CA私鑰進行簽名 

openssl x509 -req -in server/server.csr -out server/server-cert.pem -CA ca/cacert.pem -CAkey ca/cakey.pem -CAserial ca/ca-cert.srl -CAcreateserial -days 7200 

這時便產生了一個服務端證書:server-cert.pem 

若是沒有-CAcreateserial選項會出現以下錯誤: 
Loading 'screen' into random state - done 

Signature ok 

subject=/C=CN/ST=shanghai/L=shanghai/O=topfounder/OU=technology/CN=redbeans luo 

Getting CA Private Key 

ca\ca-cert.srl: No such file or directory 

3140:error:02001002:system library:fopen:No such file or directory:.\crypto\bio\{color} 

bss_file.c:349:fopen('D:\sslca\ca\ca-cert.srl','rb') 

3140:error:20074002:BIO routines:FILE_CTRL:system lib:.\crypto\bio\bss_file.c:351: 
4 導入信任的CA根證書到JSSE的默認位置($JDK_HOME/jre/lib/security/cacerts) 

keytool -import -v -trustcacerts -storepass 123456 -alias my_ca_root -file ca/cacert.pem -keystore $JAVA_HOME/jre/lib/security/cacerts 

這裏,若是$JDK_HOME/jre/lib/security/cacerts已經存在,那麼會報錯: 

keytool錯誤: java.io.IOException: Keystore was tampered with, or password was incorrect 

解決辦法之一,是將 原cacerts文件刪除便可,那樣以前導入的信任的CA根證書的配置就都沒了,令一個辦法是取一個不一樣與其餘導入的根證書的別名,也就是-alias 後面寫個不一樣的名字(導入多個根證書的時候,就要這麼作了)。 

這一步他會詢問:是否將這個根證書設爲可信任的,若是不但願提示,加上選項:-noprompt就能夠了,默認就是Y(yes)。 

5 把CA簽名後的server端證書導入keystore 

keytool -import -v -trustcacerts -storepass 123456 -alias tomcat_server -file server/server-cert.pem -keystore server/server_keystore 
這個步會一個風險,就是你用的keytool不是你剛纔導入ca根證書的jdk的,這樣的話,會報一個錯誤。 

若是你不理採的話,證書導不進去。你更改alias能夠導入進行去,但證書在使用中會出現問題,由於證書的發行者是他本身而不是根證書。 
6 查看server端證書 

keytool -list -v -keystore $JAVA_HOME/jre/lib/security/cacerts 

keytool -list -v -keystore server/server_keystore 

配置tomcat支持ssl 
修改$TOMCAT_ROOT/conf/server.xml 

使用java的ssl,而不是opensll 
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="off" /> 

<Connector protocol="org.apache.coyote.http11.Http11Protocol" 
port="8443" minSpareThreads="5" maxSpareThreads="75" 
enableLookups="true" disableUploadTimeout="true" 
acceptCount="100" maxThreads="200" 
scheme="https" 
secure="true" SSLEnabled="true" 
存儲路徑 
keystoreFile="/rpyca/server/server_keystore" 
密碼 
keystorePass="123456" 
是否須要客戶端驗證 
clientAuth="true" 
sslProtocol="TLS"/> 

創建我的證書 
1 生成client私鑰 

openssl genrsa -out client/client-key.pem 2048 
2 生成待簽名證書 

openssl req -new -out client/client-req.csr -key client/client-key.pem 
3 用CA私鑰進行簽名 

openssl x509 -req -in client/client-req.csr -out client/client.crt -signkey client/client-key.pem -CA ca/cacert.pem -CAkey ca/cakey.pem -CAserial ca/ca-cert.srl -CAcreateserial -days 7200 
4 生成client端的我的證書 

由於JSSE1.0.2沒有徹底實現了對PKCS#12格式文件的操做(只能讀取,不能輸出),因此在這裏須要用openssl製做client端的我的證書(包含私鑰)。 
openssl pkcs12 -export -clcerts -in client/client.crt -inkey client/client-key.pem -out client/client.p12 
5 安裝信任的根證書 

把D:\sslca\ca\ca-key.pem更名爲D:\sslca\ca\ca-key.cer,在client端的IE中使用"工具 'Internet選項 ' 內容 ' 證書 ' 導入"把咱們生成的CA根證書導入,使其成爲用戶信任的CA。 
6安裝我的證書 

把client.p12導入到client端的IE中做爲我的證書,導入過程同2.4.5。 

啓動Tomcat 
執行%TCAT_HOME%\bin\startup.bat啓動Tomcat 

用IE訪問Tomcat 
在IE瀏覽器的地址欄中輸入https://localhost:8443?,若是前面的操做都正確的話,應該能夠看到Tomcat的歡迎頁面。同時狀態欄上的小鎖處於閉合狀態,表示您已經成功地與服務器創建了要求客戶端驗證的SSL安全鏈接
相關文章
相關標籤/搜索