在 Linux 系统的 Nginx 服务器上部署国密SS 证书,核心思路是:编译一个集成了国密算法库(如 GmSSL 或 Tongsuo)的 Nginx,因为官方原版 Nginx 并不支持国密算法。
一、准备工作
开始之前,请确保满足以下条件:
1. 已获取国密 SSL 证书:通常包含签名证书(`sign.crt`)、签名私钥(`sign.key`)、加密证书(`encrypt.crt`)和加密私钥(`encrypt.key`)四个文件。
2. 服务器环境就绪:
拥有服务器的 `root` 或 `sudo` 权限。
确保域名已正确解析到服务器 IP。
务必开启服务器上的 `443` 端口,并在云服务商的安全组中放行该端口。
3. 安装基础编译工具(以 CentOS 为例):
bash
yum install -y gcc gcc-c++ pcre-devel zlib-devel
步骤一:编译安装支持国密的 Nginx
这一步是核心,我们需要下载国密算法库和 Nginx 源码,然后一同编译。
方案一:使用 GmSSL(老牌方案)
1. 下载并安装 GmSSL:
bash
进入常用软件目录
cd /usr/local
从 GmSSL 官网下载国密版 openssl(请替换为实际下载链接)
wget https://www.gmssl.cn/gmssl/gmssl_openssl_1.1_b8.tar.gz
tar xzfm gmssl_openssl_1.1_b8.tar.gz
解压后目录通常为 /usr/local/gmssl
2. 下载 Nginx 源码并编译:
bash
下载 Nginx 源码(以 1.18.0 版本为例)
wget http://nginx.org/download/nginx-1.18.0.tar.gz
tar -zxvf nginx-1.18.0.tar.gz
cd nginx-1.18.0
配置编译选项,关键是指定国密 openssl 路径
./configure \
prefix=/usr/local/nginx \
with-http_ssl_module \
with-openssl=/usr/local/gmssl \
with-cc-opt="-I/usr/local/gmssl/include" \
with-ld-opt="-lm"
编译并安装
make && make install
方案二:使用 Tongsuo(推荐,更活跃)
Tongsuo(原 BabaSSL)是另一个活跃的国密库,与 OpenSSL API 兼容性更好。
1. 下载并编译 Tongsuo:
bash
cd /usr/local
克隆 Tongsuo 源码(或下载 release 包)
git clone https://github.com/Tongsuo-Project/Tongsuo.git
cd Tongsuo
./config --prefix=/usr/local/tongsuo shared
make && make install
2. 下载 Nginx 源码并编译:
bash
cd /usr/local
wget http://nginx.org/download/nginx-1.18.0.tar.gz
tar -zxvf nginx-1.18.0.tar.gz
cd nginx-1.18.0
配置时指向 Tongsuo,并开启 ntls 支持
./configure \
prefix=/usr/local/nginx \
with-http_ssl_module \
with-openssl=/usr/local/tongsuo \
with-openssl-opt=enable-ntls \
with-cc-opt="-I/usr/local/tongsuo/include" \
with-ld-opt="-L/usr/local/tongsuo/lib -lm"
make && make install
提示:编译中若遇到 `ssl.h` 相关错误,可检查并修改 `nginx-1.18.0/auto/lib/openssl/conf` 文件,确保 `CORE_INCS` 等变量正确指向了国密库的 include 和 lib 目录。
骤二:上传证书文件步
在 Nginx 配置目录下创建文件夹并上传证书文件:
bash
mkdir /usr/local/nginx/conf/cert
使用 scp 或 FTP 工具将四个证书文件上传至该目录
步骤三:配置 Nginx
编辑 Nginx 配置文件 `/usr/local/nginx/conf/nginx.conf`,在 `server` 块中添加如下配置。
二、纯国密配置
nginx
server {
listen 443 ssl;
server_name your-domain.com;
开启国密(Tongsuo 使用 ssl_ntls)
ssl_ntls on;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
指定国密加密套件
ssl_ciphers "ECC-SM2-SM4-CBC-SM3:ECDHE-SM2-WITH-SM4-SM3";
ssl_prefer_server_ciphers on;
双证书配置:签名证书+加密证书
ssl_certificate cert/your-domain_sign.crt cert/your-domain_encrypt.crt;
ssl_certificate_key cert/your-domain_sign.key cert/your-domain_encrypt.key;
站点根目录等其它配置...
}
双证书(SM2+RSA)配置(推荐)
为兼顾不支持国密的浏览器,可采用双证书方案。你需要额外准备一套 RSA 证书。
nginx
server {
listen 443 ssl;
server_name your-domain.com;
国密证书配置
ssl_ntls on;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers "ECC-SM2-SM4-CBC-SM3:ECDHE-SM2-WITH-SM4-SM3";
ssl_prefer_server_ciphers on;
ssl_certificate cert/your-domain_sign.crt cert/your-domain_encrypt.crt;
ssl_certificate_key cert/your-domain_sign.key cert/your-domain_encrypt.key;
RSA 证书配置(作为 fallback)
ssl_certificate cert/your-domain_rsa.crt;
ssl_certificate_key cert/your-domain_rsa.key;
其余配置...
}
步骤四:验证与测试
1. 检查配置文件语法:
bash
/usr/local/nginx/sbin/nginx -t
若显示 `syntax is ok` 和 `test is successful` 则配置无误。
2. 启动或重启 Nginx:
bash
/usr/local/nginx/sbin/nginx -s reload
3. 验证部署结果:
浏览器访问:使用支持国密的浏览器(如密信浏览器、红莲花浏览器或开启“国密SSL通信”开关的奇安信浏览器)访问你的域名,查看是否能正常打开并显示安全锁标。
命令行测试(如果 `openssl` 支持国密):
bash
openssl s_client -connect your-domain.com:443 -ntls
常见问题
编译报错:通常是缺少依赖包,请确保已安装 `gcc`、`pcre-devel`、`zlib-devel` 等。
无法启用 HTTPS:检查服务器防火墙和云服务商安全组是否已开放 `443` 端口。
浏览器提示不安全:确认访问的域名与证书绑定的域名完全一致。
证书加载失败:检查证书文件路径和权限,确保证书格式为 PEM。
按照以上步骤操作,应该能顺利完成国密 SSL证书的部署。