国密双证书方案实战:Nginx + SM2/RSA 双证书部署完整指南

实践教程 · 2026-06-03 · 37 阅读

什么是双证书方案

在国密改造过渡期,服务端同时部署国密算法证书(SM2)和国际算法证书(RSA/ECDSA),根据客户端能力自动协商使用哪种证书。

为什么需要双证书:

  • 国密浏览器(360、奇安信等)支持 SM2 证书
  • 普通浏览器(Chrome、Firefox)不支持 SM2 证书
  • 双证书方案确保所有客户端都能正常访问

双证书 TLS 握手流程

证书链生成

生成 SM2 证书链

生成 RSA 证书链

Nginx 双证书配置

基础双证书配置

使用 GmSSL 的优化配置

如果使用 GmSSL 替换 OpenSSL,配置更简洁:

合并双证书文件

BASH
# 合并 SM2 和 RSA 证书到一个文件
cat sm2_server.crt rsa_server.crt > dual_cert.pem
cat sm2_server.key rsa_server.key > dual_key.pem

客户端兼容性处理

国密浏览器检测

双栈监听方案

更可靠的方案是使用两个监听端口:

踩坑记录

坑 1:Nginx 版本要求

Nginx 需要 1.11.5+ 才支持双证书配置。检查版本:

BASH
nginx -v

如果版本过低,需要升级或重新编译。

坑 2:证书链完整性

SM2 证书链必须包含中间 CA 和根 CA,否则国密浏览器会报证书不受信任:

BASH
# 正确:包含完整证书链
cat sm2_server.crt sm2_intermediate.crt sm2_root.crt > sm2_fullchain.crt

# 错误:只有终端实体证书
cp sm2_server.crt sm2_fullchain.crt

坑 3:密码套件协商

国密浏览器可能不支持某些密码套件组合,建议配置多个备选:

NGINX
ssl_ciphers "ECDHE-SM2-WITH-SM4-SM3:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384";

坑 4:OCSP Stapling

国密证书的 OCSP Stapling 需要额外配置:

NGINX
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/nginx/certs/sm2_root.crt;
resolver 8.8.8.8 valid=300s;

坑 5:性能影响

双证书会增加 TLS 握手开销,建议:

  • 启用会话复用:ssl_session_cache shared:SSL:10m;
  • 启用 OCSP Stapling 减少客户端验证开销
  • 考虑使用 TLS 1.3 减少握手往返

验证部署

使用 GmSSL 验证国密连接

BASH
# 测试国密连接
gmssl s_client -connect localhost:443 -cipher ECDHE-SM2-WITH-SM4-SM3

# 查看证书详情
gmssl x509 -in sm2_server.crt -text -noout

使用 OpenSSL 验证国际连接

BASH
# 测试国际连接
openssl s_client -connect localhost:443 -cipher ECDHE-RSA-AES256-GCM-SHA384

# 查看证书详情
openssl x509 -in rsa_server.crt -text -noout

浏览器验证

  • 国密浏览器访问:应显示 SM2 证书
  • Chrome/Firefox 访问:应显示 RSA 证书
  • 使用 Wireshark 抓包验证密码套件

总结

双证书方案是国密改造过渡期的务实选择。核心要点:

  • 正确生成 SM2 和 RSA 证书链
  • Nginx 配置支持双证书自动协商
  • 注意证书链完整性和密码套件兼容性
  • 做好性能优化(会话复用、OCSP Stapling)
  • 充分测试各种客户端的兼容性

*参考来源:*

  • *GM/T 0015-2012《基于 SM2 算法的数字证书格式规范》*
  • *GM/T 0024-2014《SSL VPN 技术规范》*
  • *Nginx 官方文档:ngx_http_ssl_module*
  • *GmSSL 项目:https://github.com/guanzhi/GmSSL*