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之後就能夠生成證書鏈了html
2.使用openssl生成根證書,服務端證書,客戶端證書的方法:https://blog.csdn.net/u012333307/article/details/21597101java
服務端、客戶端通過認證的證書還要分別加入到彼此的信任庫:web
目的:實現web項目的ssl雙向認證客戶端證書代碼生成。算法
使用openssl生成ca證書和服務端證書,固然也能夠經過代碼實現瀏覽器
1)建立CA私鑰,建立目錄catomcat
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地址。spa
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標準中目前使用最爲普遍的版本