Nginx单virtual host实现国密与国际双算法并行服务,关键在于协议协商机制+服务端主导套件选择+合规双签名证书链;需用Tongsuo编译、SM2私钥生成、国密套件置前、ssl_prefer_server_ciphers on,并确保证书含SM2与RSA双签发中间链。
Nginx 在单个 Virtual Host 中实现国密(SM2)与国际(RSA/ECC)双证书并行服务,关键不是“加载两套独立证书”,而是通过**协议协商机制+服务端主导套件选择+合规证书链结构**,让客户端按自身能力自动选择国密或国际加密通道。配置本身不需监听多个端口,也不用拆分 server 块。在同一个 server { ... } 块内完成全部设置:
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 为主,兼顾国密与国际客户端)双算法 ≠ 双文件,而是同一证书具备双签名能力:
SubjectPublicKeyInfo 中必须为 SM2 公钥,同时证书链中包含由 SM2 和 RSA 分别签发的中间证书(CA 自动打包)ssl_certificate 多次声明;若强行配置双 ssl_certificate 行,仅最后一行生效上线前需确认握手行为符合预期:
supported_groups 含 sm2,ServerHello 返回国密套件ECDHE-ECDSA-AES128-GCM-SHA256 等国际套件error_log /var/log/nginx/ssl_debug.log debug;,配合 ssl_protocols 和 ssl_ciphers 调试握手失败原因避免以下典型错误导致双栈失效:
TLS_SM4_SM3 等套件openssl genrsa 生成,必须用 openssl ecparam -name sm2p256v1 -genkey