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

