最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Nginx 如何在 Virtual Host 中配置国密 SSL 证书与国际双证书并行服务
时间:2026-08-17 18:28:48 编辑:袖梨 来源:一聚教程网
Nginx单virtual host实现国密与国际双算法并行服务,关键在于协议协商机制+服务端主导套件选择+合规双签名证书链;需用Tongsuo编译、SM2私钥生成、国密套件置前、ssl_prefer_server_ciphers on,并确保证书含SM2与RSA双签发中间链。
Nginx 在单个 Virtual Host 中实现国密(SM2)与国际(RSA/ECC)双证书并行服务,关键不是“加载两套独立证书”,而是通过**协议协商机制+服务端主导套件选择+合规证书链结构**,让客户端按自身能力自动选择国密或国际加密通道。配置本身不需监听多个端口,也不用拆分 server 块。核心配置要点
在同一个 server { ... } 块内完成全部设置:
- 仅启用一套证书文件路径:使用支持 SM2 签名 + RSA 双签发的国密合规证书(如 CFCA、沃通国密版),该 PEM 文件内含 SM2 公钥,且 CA 同时用 SM2 和 RSA 对同一证书签名
-
ssl_certificate 和 ssl_certificate_key 指向 SM2 证书和私钥:私钥必须是
sm2p256v1格式(openssl ecparam -name sm2p256v1 -genkey生成),不可混用 RSA 私钥 -
加密套件顺序决定优先级:把国密套件放在最前,国际套件紧随其后,例如:
ssl_ciphers "TLS_SM4_SM3:ECDHE-SM4-SM3:SM4-SM3:ECDHE-ECDSA-AES128-GCM-SHA256:AES128-GCM-SHA256"; -
强制服务端选密:必须开启
ssl_prefer_server_ciphers on;,否则客户端可能忽略国密套件而回退失败 -
协议兼容性要覆盖全:建议保留
TLSv1.2 TLSv1.3(TLCP 实际映射到 TLS 1.1,但现代部署以 1.2/1.3 为主,兼顾国密与国际客户端)
证书准备注意事项
双算法 ≠ 双文件,而是同一证书具备双签名能力:
- 向具备国密资质的 CA(如 CFCA、DNSPod 国密版)申请时,明确选择「SM2 签名 + SHA256/RSA 双签发」选项,获得一份 PEM 文件
- 该证书的
SubjectPublicKeyInfo中必须为 SM2 公钥,同时证书链中包含由 SM2 和 RSA 分别签发的中间证书(CA 自动打包) - 不要手动拼接 RSA 证书和 SM2 证书——Nginx 不支持同 server 块下
ssl_certificate多次声明;若强行配置双ssl_certificate行,仅最后一行生效
验证与调试方法
上线前需确认握手行为符合预期:
- 用国密浏览器(红莲花、奇安信)访问,检查地址栏锁图标是否显示「国密」或「SM2」标识,抓包确认 ClientHello 中
supported_groups含sm2,ServerHello 返回国密套件 - 用 Chrome/Firefox 访问,检查能否正常建立连接,抓包确认协商的是
ECDHE-ECDSA-AES128-GCM-SHA256等国际套件 - Nginx 日志开启
error_log /var/log/nginx/ssl_debug.log debug;,配合ssl_protocols和ssl_ciphers调试握手失败原因
常见误区提醒
避免以下典型错误导致双栈失效:
- 用 OpenSSL 原生版本编译 Nginx —— 必须使用 Tongsuo(铜锁)或 BabaSSL 等支持国密扩展的密码库,否则无法识别
TLS_SM4_SM3等套件 - 私钥格式错误:SM2 私钥不能用
openssl genrsa生成,必须用openssl ecparam -name sm2p256v1 -genkey - 忽略证书链完整性:国密证书链缺失 SM2 中间 CA 或 RSA 中间 CA,会导致部分客户端校验失败
- 未关闭客户端主动降级:某些旧设备会跳过服务端首选套件,此时需确保国际套件足够健壮(如包含 AES128-GCM)