一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

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 { ... } 块内完成全部设置:

  1. 仅启用一套证书文件路径:使用支持 SM2 签名 + RSA 双签发的国密合规证书(如 CFCA、沃通国密版),该 PEM 文件内含 SM2 公钥,且 CA 同时用 SM2 和 RSA 对同一证书签名
  2. ssl_certificate 和 ssl_certificate_key 指向 SM2 证书和私钥:私钥必须是 sm2p256v1 格式(openssl ecparam -name sm2p256v1 -genkey 生成),不可混用 RSA 私钥
  3. 加密套件顺序决定优先级:把国密套件放在最前,国际套件紧随其后,例如:

    ssl_ciphers "TLS_SM4_SM3:ECDHE-SM4-SM3:SM4-SM3:ECDHE-ECDSA-AES128-GCM-SHA256:AES128-GCM-SHA256";

  4. 强制服务端选密:必须开启 ssl_prefer_server_ciphers on;,否则客户端可能忽略国密套件而回退失败
  5. 协议兼容性要覆盖全:建议保留 TLSv1.2 TLSv1.3(TLCP 实际映射到 TLS 1.1,但现代部署以 1.2/1.3 为主,兼顾国密与国际客户端)

证书准备注意事项

双算法 ≠ 双文件,而是同一证书具备双签名能力:

  1. 向具备国密资质的 CA(如 CFCA、DNSPod 国密版)申请时,明确选择「SM2 签名 + SHA256/RSA 双签发」选项,获得一份 PEM 文件
  2. 该证书的 SubjectPublicKeyInfo 中必须为 SM2 公钥,同时证书链中包含由 SM2 和 RSA 分别签发的中间证书(CA 自动打包)
  3. 不要手动拼接 RSA 证书和 SM2 证书——Nginx 不支持同 server 块下 ssl_certificate 多次声明;若强行配置双 ssl_certificate 行,仅最后一行生效

验证与调试方法

上线前需确认握手行为符合预期:

  1. 用国密浏览器(红莲花、奇安信)访问,检查地址栏锁图标是否显示「国密」或「SM2」标识,抓包确认 ClientHello 中 supported_groupssm2,ServerHello 返回国密套件
  2. 用 Chrome/Firefox 访问,检查能否正常建立连接,抓包确认协商的是 ECDHE-ECDSA-AES128-GCM-SHA256 等国际套件
  3. Nginx 日志开启 error_log /var/log/nginx/ssl_debug.log debug;,配合 ssl_protocolsssl_ciphers 调试握手失败原因

常见误区提醒

避免以下典型错误导致双栈失效:

  1. 用 OpenSSL 原生版本编译 Nginx —— 必须使用 Tongsuo(铜锁)或 BabaSSL 等支持国密扩展的密码库,否则无法识别 TLS_SM4_SM3 等套件
  2. 私钥格式错误:SM2 私钥不能用 openssl genrsa 生成,必须用 openssl ecparam -name sm2p256v1 -genkey
  3. 忽略证书链完整性:国密证书链缺失 SM2 中间 CA 或 RSA 中间 CA,会导致部分客户端校验失败
  4. 未关闭客户端主动降级:某些旧设备会跳过服务端首选套件,此时需确保国际套件足够健壮(如包含 AES128-GCM)

热门栏目