1. 为什么要在nginx中支持国密算法?
国密算法(SM系列算法)是我国自主研发的密码算法标准体系,包括SM2(非对称加密)、SM3(哈希算法)、SM4(对称加密)等核心算法。随着《密码法》的实施和网络安全等级保护制度的推进,国密算法在金融、政务、通信等关键领域的应用已成为刚需。
传统nginx默认使用OpenSSL作为加密库,仅支持国际通用算法(如RSA、AES等)。要让nginx支持国密算法,需要通过以下技术路线实现:
- 使用支持国密的加密库(如GmSSL)替代OpenSSL
- 重新编译nginx以链接国密加密库
- 配置nginx启用国密套件
注意:国密算法与国际算法不兼容,部署后需确保客户端(如浏览器)也支持国密,否则会导致握手失败。
2. 环境准备与依赖项检查
2.1 基础环境要求
- 操作系统:Linux(CentOS 7+/Ubuntu 18.04+)
- 开发工具:gcc 4.8+、make、autoconf、libtool
- 磁盘空间:至少500MB可用空间
2.2 获取源码包
需要下载两个核心组件:
-
nginx源码(推荐1.20.0+版本):
bash复制
wget http://nginx.org/download/nginx-1.20.2.tar.gz tar -zxvf nginx-1.20.2.tar.gz -
GmSSL源码(国密版OpenSSL):
bash复制git clone https://github.com/guanzhi/GmSSL.git cd GmSSL
2.3 依赖库安装
bash复制# CentOS
yum install -y gcc make autoconf libtool pcre-devel zlib-devel
# Ubuntu
apt-get install -y build-essential autoconf libtool libpcre3-dev zlib1g-dev
3. 编译安装GmSSL
3.1 配置编译选项
进入GmSSL目录执行:
bash复制./config --prefix=/usr/local/gmssl \
--openssldir=/usr/local/gmssl/ssl \
enable-sm2 enable-sm3 enable-sm4 \
no-ssl3 no-weak-ssl-ciphers
关键参数说明:
enable-sm*:启用国密算法支持no-ssl3:禁用不安全的SSLv3--prefix:指定安装路径(后续nginx编译需要引用)
3.2 编译与安装
bash复制make -j$(nproc) # 并行编译加速
make test # 运行测试套件
sudo make install
3.3 环境变量配置
bash复制echo '/usr/local/gmssl/lib' | sudo tee /etc/ld.so.conf.d/gmssl.conf
sudo ldconfig
export PATH=/usr/local/gmssl/bin:$PATH
验证安装:
bash复制gmssl version # 应显示"GmSSL 2.5.4"等版本信息
gmssl list -cipher-algorithms | grep SM4 # 检查SM4支持
4. 编译支持国密的nginx
4.1 配置nginx编译参数
进入nginx源码目录:
bash复制./configure --prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-openssl=/usr/local/gmssl \
--with-openssl-opt="enable-sm2 enable-sm3 enable-sm4" \
--with-http_v2_module \
--with-http_stub_status_module
关键参数解析:
--with-openssl:指向GmSSL安装路径enable-sm*:确保国密算法被启用--with-http_ssl_module:启用SSL/TLS支持
4.2 编译与安装
bash复制make -j$(nproc)
sudo make install
4.3 验证nginx国密支持
检查nginx版本信息:
bash复制/usr/local/nginx/sbin/nginx -V
输出中应包含:
code复制built with OpenSSL (GmSSL)
TLS SNI support enabled
configure arguments: --with-openssl=/usr/local/gmssl ...
5. 配置国密HTTPS服务
5.1 生成国密证书
使用GmSSL生成SM2证书:
bash复制# 生成SM2私钥
gmssl ecparam -genkey -name sm2p256v1 -out sm2.key
# 生成CSR
gmssl req -new -key sm2.key -out sm2.csr -subj "/CN=example.com"
# 自签名证书
gmssl x509 -req -days 365 -in sm2.csr -signkey sm2.key -out sm2.crt
5.2 nginx SSL配置示例
在nginx.conf中添加:
nginx复制server {
listen 443 ssl;
server_name example.com;
ssl_certificate /path/to/sm2.crt;
ssl_certificate_key /path/to/sm2.key;
# 优先使用国密套件
ssl_ciphers ECDHE-SM2-WITH-SM4-SM3:ECDHE-SM2-SM4-CBC-SM3;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html;
}
}
5.3 国密握手测试
使用支持国密的客户端(如360安全浏览器)测试,或在服务端验证:
bash复制gmssl s_client -connect localhost:443 -cipher ECDHE-SM2-WITH-SM4-SM3
6. 性能优化与生产部署建议
6.1 国密算法性能调优
SM4相比AES在某些平台上有性能差距,可通过以下方式优化:
- 启用硬件加速(如支持SM4的CPU指令集)
- 调整nginx worker进程数:
nginx复制worker_processes auto; # 自动匹配CPU核心数 events { worker_connections 1024; }
6.2 混合加密方案
为兼容国际浏览器,可配置双证书策略:
nginx复制ssl_certificate /path/to/rsa.crt;
ssl_certificate_key /path/to/rsa.key;
ssl_certificate /path/to/sm2.crt;
ssl_certificate_key /path/to/sm2.key;
# 根据客户端能力自动选择
ssl_ciphers "ECDHE-SM2-WITH-SM4-SM3:ECDHE-RSA-AES128-GCM-SHA256";
6.3 常见问题排查
-
握手失败:
- 检查客户端是否支持国密
- 使用
gmssl s_client验证服务端配置
-
性能低下:
bash复制top -p $(pgrep nginx) # 监控nginx进程资源占用 -
证书错误:
bash复制gmssl verify -CAfile sm2.crt sm2.crt # 验证证书链
我在实际部署中发现,国密算法的兼容性需要特别注意两点:一是客户端必须明确支持国密套件,二是部分旧版GmSSL存在内存泄漏问题,建议使用2.5.4及以上版本。对于高并发场景,建议在测试环境充分验证性能表现后再上线。
