1. 用SSL進行雙向身份驗證意思就是在客戶機連接服務器時,鏈接雙方都要對彼此的數字證書進行驗證,保證這是經過授權的才能夠連接(我們鏈接一般的SSL時采用的是單向驗證,客戶機只驗證服務器的證書,服務器不驗證客戶機的證書。而連接網上銀行時使用的U盾就是用來存儲進行雙向驗證所需要的客戶端證書的)。
JDK里面內置了一個數字證書生產工具:keytool。但是這個工具只能生成自簽名的數字證書。所謂自簽名就是指證書只能保證自己是完整的,沒有經過非法修改的。但是無法保證這個證書是屬於誰的(一句話:keytool沒辦法簽發證書,而openssl能夠進行簽發和證書鏈的管理)。其實用這種自簽名的證書也是可以進行雙向驗證的(用keytool生成的自簽名證書進行雙向驗證請看這里:http://www.blogjava.net/stone2083/archive/2007/12/20/169015.html),但是這種驗證有一個缺點:對於每一個要鏈接的服務器,都要保存一個證書的驗證副本。而且一旦服務器更換證書,所有客戶端就需要重新部署這些副本。對於比較大型的應用來說,這一點是不可接受的。所以就需要證書鏈進行雙向認證。證書鏈是指對證書的簽名又一個預先部署的,眾所周知的簽名方簽名完成,這樣每次需要驗證證書時只要用這個公用的簽名方的公鑰進行驗證就可以了。比如我們使用的瀏覽器就保存了幾個常用的CA_ROOT。每次連接到網站時只要這個網站的證書是經過這些CA_ROOT簽名過的。就可以通過驗證了。
但是這些共用的CA_ROOT的服務不是免費的。而且價格不菲。所以我們有必要自己生成一個CA_ROOT的密鑰對,然后部署應用時,只要把這個CA_ROOT的私鑰部署在所有節點就可以完成驗證了。要進行CA_ROOT的生成,需要OpenSSL(http://www.openssl.org/)。你也可以在http://www.slproweb.com/products/Win32OpenSSL.html找到Windows下的版本
安裝好OpenSSL以后就可以生成證書鏈了
2.使用openssl生成根證書,服務端證書,客戶端證書的方法:https://blog.csdn.net/u012333307/article/details/21597101
服務端、客戶端經過認證的證書還要分別加入到彼此的信任庫:
目的:實現web項目的ssl雙向認證客戶端證書代碼生成。
使用openssl生成ca證書和服務端證書,當然也可以通過代碼實現
1)創建CA私鑰,創建目錄ca
openssl genrsa -out ca/ca-key.pem 1024
2)創建證書請求
openssl req -new -out ca/ca-req.csr -keyca/ca-key.pem -config openssl.cnf
在YOUR name 處一定要填寫項目布置服務器所屬域名或ip地址。
3)自簽署證書
openssl x509 -req -in ca/ca-req.csr -outca/ca-cert.pem -signkey ca/ca-key.pem -days 3650
4)導出ca證書
openssl pkcs12 -export -clcerts -inca/ca-cert.pem -inkey ca/ca-key.pem -out ca/ca.p12
只導出 ca證書,不導出ca的秘鑰
openssl pkcs12 -export -nokeys -cacerts -inca/ca-cert.pem -inkey ca/ca-key.pem -
out ca/ca1.p12
注冊服務端證書
1)創建服務端密鑰庫,別名為server,validity有效期為365天,密鑰算法為RSA, storepass密鑰庫密碼,keypass別名條碼密碼。
keytool -genkey -alias server -validity 3650-keyalg RSA -keysize 1024 -keypass 123456 -storepass 123456 -keystoreserver/server.jks
在名字和姓氏處填寫項目布置服務器所屬域名或ip地址。
2)生成服務端證書
keytool -certreq -alias server -sigalgMD5withRSA -file server/server.csr -keypass 123456 -keystore server/server.jks-storepass 123456
3)使用CA的密鑰生成服務端密鑰,使用CA簽證
openssl x509 -req -in server/server.csr-out server/server.pem -CA ca/ca-cert.pem -CAkey ca/ca-key.pem -days 3650-set_serial 1
4)使密鑰庫信任證書
keytool -import -v -trustcacerts -keypass123456 -storepass 123456 -alias root -file ca/ca-cert.pem -keystoreserver/server.jks
5)將證書回復安裝在密鑰庫中
keytool -import -v -trustcacerts -storepass123456 -alias server -file server/server.pem -keystore server/server.jks
6)生成服務端servertrust.jks信任庫
keytool -import -alias server-ca-trustcacerts -file ca/ca-cert.pem -keystore server/servertrust.jks
注冊客戶端證書
1)創建客戶端密鑰,指定用戶名,下列命令中的user將替換為頒發證書的用戶名
openssl genrsa -out client/user-key.pem1024
2)
openssl req -new -out client/user-req.csr-key client/user-key.pem
3)生成對應用戶名的客戶端證書,並使用CA簽證
openssl x509 -req -in client/user-req.csr-out client/user-cert.pem -signkey client/user-key.pem -CA ca/ca-cert.pem-CAkey ca/ca-key.pem -CAcreateserial -days 3650
4)將簽證之后的證書文件user-cert.pem導出為p12格式文件(p12格式可以被瀏覽器識別並安裝到證書庫中)
openssl pkcs12 -export -clcerts -inclient/user-cert.pem -inkey client/user-key.pem -out client/user.p12
5)將簽證之后的證書文件user-cert.pem導入至信任秘鑰庫中(這里由於沒有去ca認證中心購買個人證書,所以只有導入信任庫才可進行雙向ssl交互
keytool -import -alias user -trustcacerts-file client/user-cert.pem -keystore server/servertrust.jks
6)
keytool -list -v -alias user -keystoreserver/servertrust.jks -storepass 123456
3.配置web容器(tomcat或weblogic)tomcat conf 文件夾下的server.xml
關於X.509不同的數字證書所包含的內容信息和格式可能不盡相同,因此,需要一種格式標准來規范數字證書的存儲和校驗,大多數數字證書都以一種標准的格式(即X.509)來存儲他們的信息,X.509
提供了一種標准的方式,將證書信息規范地存儲到一系列可解析的字段中,X.509 V3 是X.509標准中目前使用最為廣泛的版本