国际与国密双证书链协同部署需国密增强版openssl(如gmssl/tongsuo),分层组织独立证书链,nginx通过客户端cipher suite自动选链,单端口智能路由。

国际算法与国密算法双证书链协同部署,本质不是“两套证书并列加载”,而是让Nginx在一次TLS握手过程中,根据客户端支持的密码套件(Cipher Suite)自动选择匹配的证书链和对应私钥。关键在于底层支持、证书结构、配置指令三者严格对齐。
必须使用国密增强版密码库
原生OpenSSL不识别SM2/SM3/SM4,因此不能直接用系统自带的nginx + openssl。必须替换为以下任一国密兼容分支,并重新编译Nginx:
-
GMSSL:开源成熟,适合中小项目,编译时需启用
enable-sm2 enable-sm3 enable-sm4 - Tongsuo(铜锁):蚂蚁集团维护,金融级稳定,硬件密码模块支持更完善
- Wosign国密模块:常用于阿里云等平台集成,提供预编译包和配套工具
验证是否生效:nginx -V 2>&1 | grep -i openssl 应显示你指定的国密路径;openssl version 应输出 GMSSL 或 Tongsuo 版本号。
证书链组织必须分层且完整
国密双证书不是“一个证书两个用途”,而是物理上独立的两对文件,每对都需含完整信任链(服务端证书 + 中间CA + 根CA),顺序拼接为单个PEM文件:
-
签名证书链:
server_sign.crt=domain_sign.crt+intermediate_sign.crt+root_sign.crt -
加密证书链:
server_enc.crt=domain_enc.crt+intermediate_enc.crt+root_enc.crt -
RSA国际证书链:
rsa_fullchain.pem=domain_rsa.crt+intermediate_rsa.crt+root_rsa.crt
注意:所有中间证书和根证书也必须是SM2公钥+SM3签名(国密链),或RSA公钥+SHA256签名(国际链),不可混用。否则客户端会报“证书链不完整”或“签名算法不匹配”。
配置中需区分指令与协议约束
Nginx配置需同时满足国密TLCP协议要求和国际TLS兼容性,不能简单复用同一组指令:
- 国密部分必须使用专用指令(仅国密版Nginx识别):
ssl_certificate /path/to/server_sign.crt;ssl_certificate_key /path/to/server_sign.key;ssl_certificate_enc /path/to/server_enc.crt;ssl_certificate_key_enc /path/to/server_enc.key; - 国际部分沿用标准指令:
ssl_certificate /path/to/rsa_fullchain.pem;ssl_certificate_key /path/to/rsa_privkey.key; - 协议与套件必须分离设置:
国密只允许ssl_protocols TLSv1.1;(TLCP标准) +ssl_ciphers ECC-SM4-SM3:ECDHE-SM4-SM3;
国际推荐ssl_protocols TLSv1.2 TLSv1.3;+ 宽泛兼容套件如ECDHE-ECDSA-AES128-GCM-SHA256
浏览器协商逻辑由客户端驱动
最终哪条证书链被使用,完全取决于客户端在ClientHello中声明的supported_groups和cipher_suites:
- 红莲花、密信、360国密版等浏览器发送含
ECC-SM4-SM3的套件 → Nginx返回SM2签名+加密证书链 - Chrome/Firefox/Safari发送
ECDHE-RSA-AES128-GCM-SHA256等 → Nginx返回RSA证书链 - 若客户端同时支持两者(极少见),优先按服务端
ssl_prefer_server_ciphers on及套件排序决定
无需额外代理或端口分流,单443端口即可完成智能路由。验证方式:用openssl s_client -connect example.com:443 -cipher "ECC-SM4-SM3"测试国密握手,用-cipher "AES128-SHA"测试RSA回退。











