在Nginx中配置国密(GM/T 0024-2014)证书时,`ssl_certificate`和`ssl_certificate_key`的用法高度依赖于你所使用的Nginx发行版**(开源社区版原生不支持国密,需使用铜锁/Tongsuo、BabaSSL或打了国密补丁的Nginx)。
核心精髓在于:国密SSL必须同时具备“签名证书对”和“加密证书对”(双证书体系)。针对这两条指令,业内有三种标准用法,请根据你的Nginx版本来选择:
1. 通用标准用法(合并文件法)—— 兼容性最高
绝大多数国密Nginx(如Tengine、铜锁Nginx)都支持将两个证书合并为一个文件,两条指令写法不变,但文件内容需按顺序拼接。
nginx
server {
listen 443 ssl;
server_name your-domain.com;
证书文件:签名证书 在前,加密证书 在后(顺序不能反)
ssl_certificate /etc/nginx/ssl/gm_all.crt;
私钥文件:签名私钥 在前,加密私钥 在后(顺序必须与证书一致)
ssl_certificate_key /etc/nginx/ssl/gm_all.key;
强制指定国密套件(必须配置,否则握手失败)
ssl_ciphers "ECC-SM2-SM4-CBC-SM3:ECDHE-SM2-SM4-CBC-SM3:ECC-SM2-SM4-GCM-SM3";
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
}
如何生成合并文件**:`cat sign.crt encrypt.crt > gm_all.crt`,`cat sign.key encrypt.key > gm_all.key`。
2. 特定扩展用法(分离指令法)—— 逻辑最清晰
如果你使用的是**铜锁(Tongsuo)** 或**GmSSL**官方补丁包,它们扩展了专属指令,将签名和加密证书分开配置,可读性更强,且无需合并文件。
nginx
server {
listen 443 ssl;
server_name your-domain.com;
签名证书及私钥(用于身份认证)
ssl_sign_certificate /etc/nginx/ssl/sign.crt;
ssl_sign_certificate_key /etc/nginx/ssl/sign.key;
加密证书及私钥(用于密钥交换)
ssl_encrypt_certificate /etc/nginx/ssl/encrypt.crt;
ssl_encrypt_certificate_key /etc/nginx/ssl/encrypt.key;
此时标准的 ssl_certificate 可以省略,或保留为空
ssl_ciphers "ECC-SM2-SM4-CBC-SM3:ECDHE-SM2-SM4-CBC-SM3";
}
3. 双栈并行用法(国际+国密双证书)
若你的Nginx版本不支持上述扩展指令,但需同时支持国际RSA和国密SM2(通常监听不同端口或依赖SNI),则严格使用标准指令指向各自的证书链。
nginx
国密站点(使用合并文件)
server {
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/gm_bundle.crt;
ssl_certificate_key /etc/nginx/ssl/gm_bundle.key;
仅开启国密套件
ssl_ciphers "ECC-SM2-SM4-CBC-SM3";
}
国际RSA站点(标准配置)
server {
listen 8443 ssl;
ssl_certificate /etc/nginx/ssl/rsa.crt;
ssl_certificate_key /etc/nginx/ssl/rsa.key;
ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384";
}
关键避坑提醒(90%故障源于此)
1. 证书链完整性:国密证书必须包含根证书和中级证书的完整链。若合并文件,需确保`根证书`放在最后(与RSA逻辑相同)。
2. 私钥权限:`ssl_certificate_key`指向的文件权限必须为`600`或`400`,且Nginx主进程需有读取权限(尤其是使用`chroot`时)。
3. 密码套件必须精确:国密标准套件名称随Nginx编译库不同略有差异(如`SM2-WITH-SM4-SM3`),务必通过`openssl ciphers -V | grep SM2`验证你的Nginx是否识别该套件名称。
4. 路径禁止使用相对路径:必须在`http`块或`server`块中使用绝对路径,否则reload时可能因工作目录切换导致找不到文件。
如果你的Nginx是阿里云、腾讯云定制版,请优先使用它们的可视化控制台生成配置,它们通常将两条指令指向`/usr/local/nginx/conf/ssl/`下的特定命名文件,切勿手动合并以免覆盖。
如果你不确定自己的Nginx支持哪种模式,可以用 `nginx -V 2>&1 | grep -i gm` 查看编译参数,有`--with-gmssl`或`--with-tongsuo`则支持扩展指令,否则请使用合并文件法。如果遇到具体报错(如`no suitable key share`),可以告诉我你的Nginx版本,我帮你定位。😊