通过Nginx搭建HTTPS双向认证代理

一、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 reloadnginx -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
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值