双向认证OPENSSL+Jboss7

来源:互联网 发布:百万高清网络摄像头 编辑:程序博客网 时间:2024/04/30 01:02


在开始之前,首先来了解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

 

·                                 .csr file is a certificate signing request which initiates your certificate request with a certificate provider and contains administrative information about your organization.

·                                 .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 certificate and key 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 []:ca@ericsson.com

 

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 - 飞
 
0 0
原创粉丝点击