用户同时配置RSA和SM2双证书,关键在于Nginx本身并不直接支持国密算法,需要更换底层软件栈,通常是通过源码编译一个集成了国密算法库的Nginx版本来实现。

简单来说,你需要安装支持国密的密码库、编译定制版Nginx,然后配置两套独立的证书。

一、核心路径:主流国密支持方案

市面上的方案主要围绕这三个核心密码库展开:

Tongsuo(铜锁):由蚂蚁集团维护,基于OpenSSL。稳定性好,社区活跃,是生产环境的首选。

GmSSL:开源的国密算法实现,更新积极,适合动手能力强的场景。

云厂商模块:如阿里云提供的WoSign国密模块,如果你的云环境正好提供,可以简化编译步骤。

二、双证书配置实操  (以Tongsuo为例)

这里以推荐度最高的Tongsuo为例,因为它能同时满足国密合规与国际兼容性。

1.  编译Nginx+Tongsuo

需要首先编译Tongsuo密码库并指定给Nginx。

bash

  1.  下载并编译  Tongsuo

git  clone  https://github.com/Tongsuo-Project/Tongsuo

cd  Tongsuo

./config  --prefix=/usr/local/tongsuo  --enable-ntls

make  &&  make  install

  2.  下载  Nginx  源码,编译时指定  Tongsuo

wget  http://nginx.org/download/nginx-1.24.0.tar.gz

tar  -zxvf  nginx-1.24.0.tar.gz

cd  nginx-1.24.0

#  设置环境变量,让Nginx能找到Tongsuo的库

export  LDFLAGS="-L/usr/local/tongsuo/lib"

export  CFLAGS="-I/usr/local/tongsuo/include"

./configure  --with-openssl=/path/to/Tongsuo  \

                        --with-http_ssl_module  \

                        --with-http_v2_module

make  &&  make  install

关键点:Nginx  必须从源码编译并指向  Tongsuo(`--with-openssl`),预编译版本通常不支持。

2.  准备证书文件

你需要准备两种证书,总共四个PEM文件。

RSA国际证书(1对):包含公钥文件  `rsa.crt`  和私钥文件  `rsa.key`。

国密SM2双证书(2对):包含SM2签名证书公钥  `sm2_sign.crt`和私钥`sm2_sign.key`,以及SM2加密证书公钥  `sm2_enc.crt`和私钥`sm2_enc.key`。

注意:所有的私钥文件必须是**未加密的PEM格式**,并设置600权限以保障安全。

3.  配置Nginx

在Nginx配置文件中,你需要同时配置国际算法和国密算法的相关指令。

nginx

server  {

        listen  443  ssl;

        server_name    yourdomain.com;

        #  1.  关键:开启国密NTLS支持

        enable_ntls    on;

        #  2.  国际算法RSA证书配置

        ssl_certificate            /path/to/rsa.crt;

        ssl_certificate_key    /path/to/rsa.key;

        #  3.  国密算法SM2证书配置(签名+加密双证书)

        ssl_sign_certificate          /path/to/sm2_sign.crt;

        ssl_sign_certificate_key  /path/to/sm2_sign.key;

        ssl_enc_certificate            /path/to/sm2_enc.crt;

        ssl_enc_certificate_key    /path/to/sm2_enc.key;

        #  4.  通用TLS协议和国密专用加密套件配置

        ssl_protocols              TLSv1.1  TLSv1.2  TLSv1.3;

        ssl_ciphers                  ECC-SM4-CBC-SM3:ECDHE-SM4-CBC-SM3:RSA-SM4-CBC-SM3:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;

        ssl_prefer_server_ciphers  on;

        ssl_ecdh_curve            sm2p256v1;

}

关键参数解释:

      `enable_ntls  on;`:Tongsuo扩展指令,是启用国密双证书握手的总开关,必须开启。

      `ssl_sign_certificate`  /  `ssl_enc_certificate`:Tongsuo扩展指令,分别指向SM2签名证书和加密证书的PEM文件。

      `ssl_ciphers`:该配置实现了**协议自动适配**,国密浏览器会优先匹配`ECC-SM4-CBC-SM3`等国密套件,而国际浏览器会回退到后续的国际标准加密套件,从而实现一套配置、全兼容的效果。

验证部署成果

完成配置后,建议进行以下验证:

1.    语法检查:运行  `nginx  -t`  检查配置文件是否正确。

2.    国际浏览器测试:使用Chrome、Firefox等浏览器访问,应正常工作。

3.    国密客户端测试:使用红莲花、360安全浏览器(国密版)  或密信浏览器等支持国密算法的浏览器访问,检查地址栏是否显示安全锁且无警告。

4.    命令行测试:可使用集成了Tongsuo的`openssl`客户端工具测试国密握手:

        bash

        openssl  s_client  -connect  yourdomain.com:443  -ntls  -cipher  "ECC-SM4-CBC-SM3"

  部署的核心在于选用正确的底层密码库和完成Nginx的定制编译。对于生产环境,Tongsuo是平衡了功能、稳定性和维护成本的选择;而追求最新技术特性时,GmSSL是很好的选择。