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标准中目前使用最为普遍的版本