用户同时配置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是很好的选择。