一、双向认证
CA认证有单向认证和双向认证,在我们日常网页浏览中,我们接触到的大多数是单向认证,而在一些银行系统等对安全性要求比较高的系统,会采用双向认证。
单向认证只是客户端(浏览器)认证服务端(例如tomcat等), 双向认证指的是服务端和客户端之间相互都要认证(在浏览器体现为需要安装进证书)。
https的双向认证大概过程(摘自http://blog.chinaunix.net/uid-26335251-id-3508651.html):
1 浏览器发送一个连接请求给安全服务器。
2 服务器将自己的证书,以及同证书相关的信息发送给客户浏览器。
3 浏览器检查服务器送过来的证书是否是由自己信赖的 CA 中心所签发的。如果是,就继续执行协议;如果不是,客户浏览器就给客户一个警告消息:警告客户这个证书不是可以信赖的,询问客户是否需要继续。
4 接着客户浏览器比较证书里的消息,与服务器刚刚发送的相关消息是否一致,如果是一致的,客户浏览器认可这个服务器的合法身份。
5 服务器要求客户发送客户自己的证书。收到后,服务器验证客户的证书,如果没有通过验证,拒绝连接;如果通过验证,服务器获得用户的公钥。
6 客户浏览器告诉服务器自己所能够支持的通讯对称密码方案。
7 服务器从客户发送过来的密码方案中,选择一种加密程度最高的密码方案,用客户的公钥加过密后通知浏览器。
8 浏览器针对这个密码方案,选择一个通话密钥,接着用服务器的公钥加过密后发送给服务器。
9 服务器接收到浏览器送过来的消息,用自己的私钥解密,获得通话密钥。
10 服务器、浏览器接下来的通讯都是用对称密码方案,对称密钥是加过密的。
二、搭建CA证书颁发中心
1 创建rsaCA目录
mkdir rsaCA
mkdir -p ./rsaCA/{private,newcerts} && \
touch ./rsaCA/index.txt && \
touch ./rsaCA/serial && \
echo 01 > ./rsaCA/serial
touch rsaCA/index.txt.attr
把openssl.cnf放到rsaCA目录下
2 生成ca私钥
openssl genrsa -out ./rsaCA/private/cakey.pem 2048
3 生成证书请求
openssl req -new -days 3650 -key ./rsaCA/private/cakey.pem -out careq.pem -config ./rsaCA/openssl.cnf
4 根据CA私钥生成CA的自签名证书
openssl ca -selfsign -in careq.pem -out ./rsaCA/cacert.pem -extensions v3_ca -config ./rsaCA/openssl.cnf
三、生成客户端证书
1 客户端私钥生成证书签名请求( cacsr.cer为请求证书,client_crt.cer为签名证书)
生成RSA私钥
openssl genrsa -out client.pem 2048
生成证书请求
openssl req -new -days 3650 -key client.pem -out client_csr.pem -config ./rsaCA/openssl.cnf
2.使用CA的私钥和证书对用户证书签名(openssl.cnf为gmssl/ssl目录下的配置文件)
openssl ca -in client_csr.pem -out client_cert.cer -extensions v3_ca -config ./rsaCA/openssl.cnf
四、生成服务端证书(这里使用的是tomcat)
1 生成服务器证书
使用keytool为Tomcat生成证书,假定目标机器的域名是localhost或者“192.168.1.1”,keystore文件为tomcat.keystore,口令为“logiscn”,使用如下命令生成:
keytool -genkey -v -alias tomcat -keyalg RSA -keystore tomcat.keystore -dname "CN=192.168.1.1,OU=logiscn,O=logis,L=beijing,ST=beijing,C=CN" -validity 3650 -storepass logiscn -keypass logiscn
2 将CA机构自签名证书导入tomcat中
keytool -import -alias ca -v -file ./rsaCA/cacert.pem -keystore /root/rsa/tomcat.keystore -storepass logiscn
3 将客户端证书导入tomcat中
keytool -import -alias tianli -v -file /root/CA/test/client_crt.cer -keystoretomcat.keystore -storepass logiscn
4 配置Tomcat服务器
打开Tomcat根目录下的/conf/server.xml,找到如下配置段,修改如下:
打开注释
<Connector port="443" protocol="org.apache.coyote.http11.Http11Protocol" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="true" sslProtocol="TLS"
keystoreFile="/root/rsa/tomcat.keystore" keystorePass="logiscn"
truststoreFile="/root/rsa/tomcat.keystore" truststorePass="logiscn" />
其中,clientAuth指定是否需要验证客户端证书,如果该设置为“false”,则为单向SSL验证,SSL配置可到此结束。如果clientAuth设置为“true”,表示强制双向SSL验证,必须验证客户端证书。如果clientAuth设置为“want”,则表示可以验证客户端证书,但如果客户端没有有效证书,也不强制验证。
5 重启tomcat
五、实现类似银行U盾的操作
以前用过网银的朋友们可能知道,在我们登录网银的时候是需要插入一个U盾的,其实他也是一个双向认证的原理。在这里,我们可以借助第三方工具u-key来实现。
可以购买市面上现成的u-key,将上述做成的客户端证书导入u-key中,在设置u-key的密码,这样就可以实现客户想要访问服务器,必须拥有u-key以及登录密码才可访问的功能了。
附:
openssl一些用法
显示证书信息。
cacert.pem为已加签后的证书文件
opensslx509 -text -noout -in cacert.pem
显示申请加签的证书信息
cacsr.pem为申请加签的文件
openssl req -in cacsr.pem -noout -text
显示公私钥信息
cakey.pem为私钥文件
openssl pkey -pubout -in cakey.pem -noout-text
由私钥文件导致公钥命令
cakey.pem为私钥文件,public.pem为生成的公钥文件
openssl pkey -pubout -in cakey.pem -out public.pem
显示公钥文件的公钥信息
public.pem为公钥文件
openssl pkey -pubin -in public.pem -noout -text
提取用户证书:
openssl pkcs12 -in test.p12 -clcerts -nokeys -out cert.pem //pem格式
openssl pkcs12 -in test.p12 -clcerts -nokeys -out cert.crt //crt格式
如果需要携带秘钥,则去掉 -nokeys
openssl pkcs12 -in test.p12 -clcerts -out cert.pem //pem格式
openssl pkcs12 -in test.p12 -clcerts -out cert.crt //crt格式
提取私钥:
openssl pkcs12 -in test.p12 -nocerts -out key.pem
将证书、私钥转换为p12格式:
gmssl pkcs12 -export -clcerts -in client_cert.cer –inkey client.pem -out
一关于keytool的一些指令:
https://spdx4046.iteye.com/blog/1554577
openssl指令部分说明:
https://zhuanlan.zhihu.com/p/26646377
openssl配置文件说明:
https://www.cnblogs.com/f-ck-need-u/p/6091027.html