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

tech2026-06-06  3

一、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
最新回复(0)