一、Nginx双向认证配置:
在 Nginx.conf 增加如下 server 配置,或者在 Nginx.conf 指定读取其他子配置文件的位置,比如:include /etc/nginx/conf.d/*.conf
,这里指定扫描并读取 /etc/nginx/conf.d/ 目录下的 .conf 后缀结尾的文件。
sslProxy.conf:
server {
listen 55111 ssl;
server_name 11.11.11.111;
#ssl_certificate:配置服务器证书的pub_key全路径(.pem/.crt/.cer),此证书在单向认证中发给客户端,客户端自己寻找完整证书链进行校验
ssl_certificate /home/victor_lv/ssl/server.crt;
#ssl_certificate_key:配置服务端密钥对证书全路径(.key),需与ssl_certificate配套
ssl_certificate_key /home/victor_lv/ssl/server.key;
#ssl_client_certificate:配置客户端证书链(根证书和中间证书)-双向认证时使用,会带到Distinguished Names(.pem/.crt/.cer)
ssl_client_certificate /home/victor_lv/ssl/cacert.pem;
#ssl_trusted_certificate /home/cu_expws/langlv/ssl/merge_cfca_ev_roo_ov_oca_pm.crt;
# 启用双向认证
ssl_verify_client on;
ssl_session_cache shared:SSL:1m;
# 超时时间
ssl_session_timeout 5m;
# 支持的密码套件列表
ssl_ciphers HIGH:!aNULL:!MD5;
#ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
# 优先选用server端的密码套件
ssl_prefer_server_ciphers on;
#反向代理
location / {
proxy_pass http://172.22.22.22:11000/testapp/;
}
}
ssl_certificate 配的是服务器证书的 pub_key(.cer / .crt / .pem格式都行);
ssl_certificate_key 配的是服务器证书的 pri_key(.key 文件);
ssl_client_certificate 配的是客户端签名证书对应的上级证书(根证书、中间证书),如果证书链深度不止2,那么把根证书和中间证书 merge 一下再配进去就好了,merge 的方式很简答,直接cat 重写到新文件即可:
cat root.crt middle.crt > merge_root_middle.crt
配置文件配好后,执行 nginx -s reload
和 nginx -t
重新刷入Nginx配置。
然后客户端访问 url https://11.11.11.111:11000/testapp/
即可。
二、单向认证
如果仅需要单向认证,把 ssl_verify_client 置成 false 即可,然后 ssl_client_certificate 也可以不写了。
三、keytool命令查看pfx证书信息
利用 JDK 自带的 keytool 命令行可以查看 pfx 证书信息(pfx如果先前挂了完整证书链信息也能展示出来)。
keytool -list -v -keystore client.pfx -storetype PKCS12 -storepass 111111
示例如下:
>keytool -list -v -keystore client.pfx -storetype PKCS12 -storepass 111111
密钥库类型: PKCS12
密钥库提供方: SunJSSE
您的密钥库包含 1 个条目
别名: {5a4a5dae-6f84-47f6-a2f3-e9bba0cf9d94}
创建日期: 2020-9-3
条目类型: PrivateKeyEntry
证书链长度: 3
证书[1]:
所有者: CN=xxxxxx, OU=Enterprises, OU=CUPRA, O=CFCA OCA1, C=cn
发布者: O=CFCA OCA1, C=CN
序列号: 111111111
有效期开始日期: Thu Nov 02 16:15:00 CST 2017, 截止日期: Mon Nov 02 16:15:00 CST 2020
证书[2]:
所有者: O=CFCA OCA1, C=CN
发布者: O=CFCA CS CA, C=CN
序列号: 222222
有效期开始日期: Sat May 21 01:41:24 CST 2011, 截止日期: Fri May 16 01:41:24 CST 2031
证书[3]:
所有者: O=CFCA CS CA, C=CN
发布者: O=CFCA CS CA, C=CN
序列号: 3333333
有效期开始日期: Fri May 20 23:27:05 CST 2011, 截止日期: Sun May 12 23:27:05 CST 2041
四、生成证书链jks文件
jks文件生成后还需要加入到信任列表: 用jdk自带keytool工具将 JKS 证书链添加到信任列表中:
C:\Java\jdk1.4.2\bin\keytool -import -alias cer2020 -file root.cer
-keystore myTrust.jks -storepass 111111
也可以用Java代码用如下代码导入JVM环境变量中:
System.setProperty("javax.net.ssl.trustStore",TruststoreFilePath);
从jks文件中导出公钥证书:
keytool -export -alias cer2020 -keystore myTrust.jks -storepass 111111 -file
root.cer
五、生成自签发证书
在要生成证书的目录下建立几个文件和文件夹,有./demoCA/ ./demoCA/newcerts/ ./demoCA/index.txt
./demoCA/serial,在serial文件中写入第一个序列号“01”
1.生成X509格式的CA自签名证书
$openssl req -new -x509 -keyout ca.key -out ca.crt
2.生成服务端的私钥(key文件)及csr文件
$openssl genrsa -des3 -out server.key 1024
$openssl req -new -key server.key -out server.csr
3.生成客户端的私钥(key文件)及csr文件
$openssl genrsa -des3 -out client.key 1024
$openssl req -new -key client.key -out client.csr
4.用生成的CA的证书为刚才生成的server.csr,client.csr文件签名
$openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key
$openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key
5.生成p12格式证书
$openssl pkcs12 -export -inkey client.key -in client.crt -out client.pfx
$openssl pkcs12 -export -inkey server.key -in server.crt -out server.pfx
6.生成pem格式证书
有时需要用到pem格式的证书,可以用以下方式合并证书文件(crt)和私钥文件(key)来生成
$cat client.crt client.key> client.pem
$cat server.crt server.key > server.pem
7.PFX文件转换为X509证书文件和RSA密钥文件
$openssl pkcs12 -in server.pfx -nodes -out server.pem
$openssl rsa -in server.pem -out server2.key
$openssl x509 -in server.pem -out server2.crt
这样生成服务端证书:ca.crt, server.key, server.crt, server.pem, server.pfx,客户端证书:ca.crt,
client.key, client.crt, client.pem, client.
六、验证证书链签发关系:
验证证书链签发关系 ,这里的 merge_ev_root_ov_oca.crt 合并了根证书和中间证书:
openssl verify -CAfile merge_ev_root_ov_oca.crt server.crt