Nginx 原生不支持国密算法,必须使用国密增强版 OpenSSL(如 GMSSL 或 Tongsuo)、源码编译支持国密的 Nginx,并按 TLCP 要求部署 SM2/SM3/SM4 双证书结构。

Nginx 原生不支持国密算法,必须通过替换底层密码库、重编译并正确配置证书链来实现 SM2/SM3/SM4 支持。这不是改几行配置就能生效的事,关键在三步:用对密码库、编译对 Nginx、配对证书结构。
必须使用国密增强版 OpenSSL(如 GMSSL 或 Tongsuo)
标准 OpenSSL 无法识别 SM2 曲线 OID、SM3 摘要标识或 SM4 套件名。即使你在 ssl_ciphers 里写 ECDHE-SM2-SM4-SM3,也会被静默忽略或报错。
你需要:
- 下载并安装 GMSSL(推荐 v3.1+)或 Tongsuo(蚂蚁开源,金融级稳定)
- 安装路径统一设为
/usr/local/gmssl或/usr/local/tongsuo,避免与系统 OpenSSL 冲突 - 验证是否生效:
-
gmssl version或tongsuo version输出中含sm2/sm3/sm4 -
openssl ecparam -list_curves | grep sm2有回显 -
ldd $(which nginx) | grep ssl指向国密库路径
-
必须源码编译支持国密的 Nginx
Nginx 官方源码未适配 SM2 证书 ASN.1 结构、TLCP 扩展或 Key Usage 字段校验。直接 patch 模块无效。
- 下载 Nginx 源码(如 1.20+)
- configure 时明确指定:
./configure \ --with-http_ssl_module \ --with-openssl=/usr/local/gmssl \ --with-openssl-opt="enable-sm2 enable-sm3 enable-sm4"
- 手动检查
auto/lib/openssl/conf,确保头文件和库路径均指向国密版本 - 编译安装后运行
nginx -V 2>&1 | grep -i openssl,确认链接的是 GMSSL/Tongsuo
必须按合规要求部署双证书结构
国密 TLS(即 TLCP 协议)强制签名与加密分离,不能复用同一对密钥:
-
server_sign.crt+server_sign.key:用于身份认证与数字签名(Key Usage =digitalSignature) -
server_enc.crt+server_enc.key:用于密钥封装与数据加解密(Key Usage =keyEncipherment) - 两套私钥必须由不同密钥对生成,不可混用
- 证书需由 CFCA、上海 CA 等支持国密双证书的机构签发
Server 块中启用国密的核心配置
server {
listen 443 ssl;
server_name example.com;
# 签名证书(必需)
ssl_certificate /path/to/server_sign.crt;
ssl_certificate_key /path/to/server_sign.key;
# 加密证书(国密定制版 Nginx 特有指令)
ssl_certificate_enc /path/to/server_enc.crt;
ssl_certificate_key_enc /path/to/server_enc.key;
# TLCP 协议对应 TLSv1.1(硬性要求,设 TLSv1.2 将握手失败)
ssl_protocols TLSv1.1;
# 仅启用国密套件,禁用所有国际算法
ssl_ciphers ECC-SM4-SM3:ECDHE-SM4-SM3;
ssl_prefer_server_ciphers on;
}注意:ssl_certificate_enc 和 ssl_certificate_key_enc 是国密定制版 Nginx 才识别的指令,原生 Nginx 会报错“unknown directive”。
不复杂但容易忽略


















