1. 程式人生 > >雙向認證OPENSSL+Jboss7 (原創)

雙向認證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.csrfile is a certificate signing request which initiates your certificate request with a certificate provider and contains administrative information about your organization.

·A.keyfile is the private key used to encrypt your site’s SSL-enabled requests.

·.pemand.crtextensions are often used interchangeably and are both base64 ASCII encoded files. The technical difference is that.pemfiles contain both the certificateandkey whereas a.crtfile 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. 匯入clientserver籤後的證書

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. 匯入clientserver籤後的證書

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簽名生成符合X509crt匯入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簽名生成符合X509crt匯入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.keystoreclient_trust.keystore

雙向認證OPENSSL+Jboss7 - Edison - 飛   雙向認證OPENSSL+Jboss7 - Edison - 飛  
最後給出一篇寫的很好地原理性文章: http://www.cnblogs.com/JeffreySun/archive/2010/06/24/1627247.html