在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版本,我帮你定位。😊