雙向認證OPENSSL+Jboss7 (原創)
轉貼地址:http://xeseo.blog.163.com/blog/static/5632431620130825428120/
在開始之前,首先來了解SSL。
SSL全稱Secure Socket Layer,它用來保證C/S之間傳輸的安全性。怎麼保證的呢?其實它提供了雙重保障:
1. Security
利用非對稱加密RSA演算法,公鑰對報文內容加密,私鑰來解密,保證了即使截獲了加密資訊,沒有金鑰不能解密。
2. Authentication
用符合X509協議的證書,對客戶端或服務端進行校驗,確保其就是目標機器。
更具體的可以參看JAVA關於encryption的解釋:http://medialab.di.unipi.it/web/doc/JNetSec/jns_ch11.htm
SSL中keystore檔案來存放金鑰,主要是存放私鑰,當然你也可以存放公鑰,不過因為既然是公鑰,必然要符合x.509協議。所以一般存放私鑰的keystore和公鑰的keystore要區分開。因為format不一樣。
證書的生成分為兩種:
1. 自認證
Java提供了一個工具,名為keytool,用該工具可以生成keystore,並可以export成符合x.509協議的證書。因為該認證過程沒有任何有效單位提供保證,是為自認證。
2. CA認證
client端和server端找了一個共同的部門來做認證,他們都信賴該“有關部門”,即Certificate Authority。一些官方的CA機構都是收費滴,比如Microsoft的,一旦經過它的保證,你再開啟HTTPS頁面,就不會提示你該機構證書無效了。
大致過程如下:
a. 在雙向認證中,client端和server端各自身生成自己的keystore存放私鑰;
b. 並根據該keystore生成.csr檔案,即Certificate Sign Request檔案;
c. 他們把該檔案發給CA,那麼雙方在CA那端對對方資訊進行核對,以防嫁錯人;
d. 核對成功後,CA蓋章了,給他們簽發了證書crt;
e. client和server各自拿到CA的根證書和對方的證書,導到自己的trust_keystore中。
這裡,之所以要導到自己的trust_keystore中,是因為在SSL連線開始時,client端給server端發一個hello後,server會把自己的證書發給它,client端要用該證書裡面的公鑰對隨機數進行加密,併發回給server,server會用自己的金鑰進行解密校驗。
瀏覽器裡面,它會提示你,一旦你點選確定,它相當於快取了一下,後面所有請求都會用該快取。當然也可以自己手動把該證書匯入OS的證書庫去。在這裡,因為是應用程式,必須要有自己的證書庫,做的就是把證書匯入證書庫,這樣就不用在應用程式裡用快取的了。
下面介紹如何進行CA認證:
一.用openssl做好CA認證準備
1. 生成目錄樹
CARoot
|--certs
|--newcerts
|--private
|--crl
以後所有操作預設在CARoot目錄下
2. 生成文字資料庫檔案
CARoot根目錄下手動建立一個空的文字資料庫檔案index.txt
touch index.txt
3. 生成證書序列號檔案
在CARoot下建立證書序列號檔案serial
echo "01" > serial
4. 修改配置檔案
將$OPENSSL_HOME下的apps\openssl.cnf ( 或 /etc/ssl/openssl.cnf)拷貝到CARoot目錄下,然後修改openssl.cnf檔案
dir = ./ # Where everything is kept
·A.csr
file
is a certificate signing request which initiates your certificate request with a certificate provider and contains administrative information about your organization.
·A.key
file
is the private key used to encrypt your site’s SSL-enabled requests.
·.pem
and.crt
extensions
are often used interchangeably and are both base64 ASCII encoded files. The technical difference is that.pem
files
contain both the certificateandkey whereas a.crt
file
only contains the certificate. In reality this distinction is often ignored.
5. 產生CA私鑰
openssl genrsa -out ./private/cakey.pem 1024
PS:
如果有unable to write “random’ state 錯誤的話,那麼:
a. touch ./private/.rnd
b. openssl rand –out ./private/.rand 1024
用自己生產的rand來替代預設,會提示輸入密碼,如果輸入密碼,以後用該私鑰都需要輸入密碼
openssl genrsa -out ./private/cakey.pem -rand ./private/.rnd -des3 2048
(pass phrase for ./private/ca.key:openssl-ca)
6. 建立證書請求
openssl req -new -out cacert.csr -key ./private/cakey.pem -config ./openssl.cnf
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:cn
State or Province Name (full name) [Some-State]:shanghai
Locality Name (eg, city) []:shanghai
Organization Name (eg, company) [Internet Widgits Pty Ltd]:mycomp
Organizational Unit Name (eg, section) []:mycomp
Common Name (eg, YOUR name) []:10.170.65.54
Email Address []:[email protected]
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
注:公司和單位名字,CA,client,server最好是一樣的。
Common Name,對於client和server,會做IP校驗,所以必須是真實的域名或者IP
7. 自簽署CA證書
openssl x509 -req -in cacert.csr -out cacert.pem -signkey ./private/cakey.pem -days 3650
(可選)8. 將證書匯出
JkS格式:
keytool -keystore truststore.jks -keypass embms1234 -storepass embms1234 -alias ca -import -trustcacerts -file cacert.pem
PKCS12 格式:
openssl pkcs12 -export -clcerts -in cacert.pem -inkey private/cakey.pem -out ca.p12
二.簽署Server端證書
1. 生成keystore檔案
keytool -genkey -alias server -keyalg RSA -keystore server.keystore -dname "CN=10.175.132.209,OU=ericsson,O=ericsson,L=shanghai,ST=shanghai,C=cn" -storepass embms1234 -keypass embms1234
2. 根據keystore生成 csr檔案
keytool -certreq -alias server -keyalg RSA -keystore server.keystore -file server.csr -storepass embms1234 -keypass embms1234
3. 把csr檔案拷到CA伺服器上
4. 簽署server證書
openssl ca -config ./openssl.cnf -in ./certs/server.csr -out ./certs/server.pem
5. 匯出server證書CER格式
openssl x509 -in ./certs/server.pem -out ./certs/server.cer
三.簽署Client端證書
1. 生成keystore檔案
keytool -genkey -alias client -keyalg RSA -keystore client.keystore -dname "CN=10.175.132.217,OU=ericsson,O=ericsson,L=shanghai,ST=shanghai,C=cn" -storepass embms1234 -keypass embms1234
2. 根據keystore生成 csr檔案
keytool -certreq -alias client -keyalg RSA -keystore client.keystore -file client.csr -storepass embms1234 -keypass embms1234
3. 把csr檔案拷到CA伺服器上
4. 簽署client證書
openssl ca -config ./openssl.cnf -in ./certs/client.csr -out ./certs/client.pem
5. 匯出server證書CER格式
openssl x509 -in ./certs/client.pem -out ./certs/client.cer
四. Server端匯入Client證書
1. 把client.cer, server.cer, cacert.pem拷到Server端
2. 匯入根證書
keytool -keystore server.keystore -alias ca -import -file cacert.pem
3. 匯入client和server籤後的證書
keytool -keystore server.keystore -alias server -import -file server.cer
keytool -keystore server.keystore -alias client -import -file client.cer
4. 匯出證書給client作為trust證書
keytool -export -alias server -file server.crt -keystore server.keystore -storepass embms1234 -keypass embms1234
五. Client端匯入Server證書
1. 把client.cer, server,cer, truststore.jks, cacert.pem拷到Client端
2. 匯入根證書
keytool -keystore client.keystore -alias ca -import -file cacert.pem
3. 匯入client和server籤後的證書
keytool -keystore client.keystore -alias server -import -file server.cer
keytool -keystore client.keystore -alias client -import -file client.cer
4. 匯出證書給Server作為trust證書
keytool -export -alias client -file client.crt -keystore client.keystore -storepass embms1234 -keypass embms1234
六. 建立Trust證書
Client端:
1. 把server端生成server.crt拷到client端
2. 根據根證書生成trust_keystore
keytool -import -alias ca -trustcacerts -noprompt -file cacert.pem -keystore client_trust.keystore -storepass embms1234 -keypass embms1234
3. 將server端經過CA簽名生成符合X509的crt匯入trust_keystore
keytool -import -alias server -trustcacerts -noprompt -file server.crt -keystore client_trust.keystore -storepass embms1234 -keypass embms1234
Server端:
1. 把client端生成client.crt拷到server端
2. 根據根證書生成trust_keystore
keytool -import -alias ca -trustcacerts -noprompt -file cacert.pem -keystore server_trust.keystore -storepass embms1234 -keypass embms1234
3. 將client端經過CA簽名生成符合X509的crt匯入trust_keystore
keytool -import -alias client -trustcacerts -noprompt -file client.crt -keystore server_trust.keystore -storepass embms1234 -keypass embms1234
七. 最後配置
1. EAP6裡面,更新standalone如下
<connector name="https" protocol="HTTP/1.1" scheme="https" socket-binding="https" secure="true" enabled="true">
<ssl name="ssl" key-alias="server" password="embms1234" certificate-key-file="/opt/keystores/server.keystore" protocol="all" verify-client="true" ca-certificate-file="/opt/keystores/server_trust.keystore"/>
</connector>
2. 在client端發REST請求時,帶上client.keystore和client_trust.keystore
最後給出一篇寫的很好地原理性文章: http://www.cnblogs.com/JeffreySun/archive/2010/06/24/1627247.html