Nginx 国密 SSL证书配置中的 ssl_certificate 指令详细分解
一、核心规则
国密证书采用“双证书”体系,签名证书和加密证书分开,因此在 Nginx 的 `ssl_certificate` 和 `ssl_certificate_key` 指令中,需要按照先签名证书、后加密证书的顺序配置,签名和加密证书的私钥可能相同也可能不同(具体取决于国密模块的实现)。这与传统 RSA 证书的单证书模式有本质区别。
国密双证书配置的核心语法结构如下:
nginx
ssl_certificate 签名证书路径; # 签名证书(用于身份认证)
ssl_certificate_key 签名证书私钥路径; # 签名证书私钥
ssl_certificate 加密证书路径; # 加密证书(用于密钥交换)
ssl_certificate_key 加密证书私钥路径; # 加密证书私钥
二、通用双证书配置模板
以下是一个符合国密双证书体系的通用 Nginx `server` 块配置:
nginx
server {
listen 443 ssl;
server_name your-domain.com; # 您的域名
# === 国密签名证书 ===
ssl_certificate /path/to/your_sign.crt;
ssl_certificate_key /path/to/your_sign.key;
# === 国密加密证书(先签名后加密) ===
ssl_certificate /path/to/your_encrypt.crt;
ssl_certificate_key /path/to/your_encrypt.key;
# === 国密 TLS 协议和密码套件 ===
# 注:GMv1 为国密协议标识,需要国密版 Nginx 支持
ssl_protocols GMv1 TLSv1.2 TLSv1.3;
ssl_ciphers ECC-SM2-WITH-SM4-SM3:ECDHE-SM2-WITH-SM4-SM3:!aNULL:!eNULL;
ssl_prefer_server_ciphers on;
# 会话缓存
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
location / {
root /var/www/html;
index index.html index.htm;
}
}
三、具体平台配置实例
1. 华为云 Nginx 国密配置示例
华为云文档提供了一套完整的配置方案,包含签名证书和加密证书的配置入口:
nginx
server {
listen 443 ssl;
server_name test.com; # 您的域名
# 签名证书(身份认证)
ssl_certificate cert/server.crt; # 签名证书文件路径
ssl_certificate_key cert/server.key; # 签名证书私钥路径
# 加密证书(密钥交换)
ssl_certificate cert/enc_server.crt; # 加密证书文件路径
ssl_certificate_key cert/enc_server.key; # 加密证书私钥路径
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:AES128-SHA:DES-CBC3-SHA:ECC-SM4-CBC-SM3:ECC-SM4-GCM-SM3;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
2. 沃通(WoSign)国密双证书配置示例
沃通国密证书包中通常包含签名证书(`sign.crt`)和加密证书(`en.crt`):
nginx
server {
listen 443 ssl;
server_name domain.com;
# RSA 证书(国际兼容)
ssl_certificate d:/gmssl/nginx-1.16.0/conf/ssl/domain.com_rsa.crt;
ssl_certificate_key d:/gmssl/nginx-1.16.0/conf/ssl/domain.com_rsa.key;
# 国密签名证书
ssl_certificate d:/gmssl/nginx-1.16.0/conf/ssl/domain.com_sign.crt;
ssl_certificate_key d:/gmssl/nginx-1.16.0/conf/ssl/domain.com_sm2.key;
# 国密加密证书
ssl_certificate d:/gmssl/nginx-1.16.0/conf/ssl/domain.com_en.crt;
ssl_certificate_key d:/gmssl/nginx-1.16.0/conf/ssl/domain.com_sm2.key;
# 此处签名、加密证书的私钥 key 为同一个,签名证书请在前
ssl_session_timeout 5m;
ssl_protocols TlSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers ECC-SM4-SM3:ECDH:AESGCM:HIGH:MEDIUM:!RC4:!DH:!MD5:!aNULL:!eNULL;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
3. GDCA 国密证书配置示例
国内数安时代(GDCA)的国密证书配置方式类似:
nginx
server {
listen 443 ssl;
server_name www.trustauth.cn;
# SM2 签名证书和私钥
ssl_certificate d:/gmssl/gdca_nginx/conf/ssl/www.trustauth.cn_sign_chain.crt;
ssl_certificate_key d:/gmssl/gdca_nginx/conf/ssl/www.trustauth.cn.key;
# SM2 加密证书(与签名证书共用同一个私钥)
ssl_certificate d:/gmssl/gdca_nginx/conf/ssl/www.trustauth.cn_encrypt_chain.crt;
ssl_certificate_key d:/gmssl/gdca_nginx/conf/ssl/www.trustauth.cn.key;
ssl_session_timeout 5m;
ssl_ciphers SM2-WITH-SMS4-SM3:ECDH:AESGCM:HIGH:MEDIUM:!RC4:!DH:!MD5:!aNULL:!eNULL;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
四、重要使用说明
要点 说明
证书顺序 先配置签名证书(用于身份认证),后配置加密证书(用于密钥交换),顺序不可随意调换
证书路径 路径中不能包含中文字符,例如应使用 `/usr/local/nginx/conf/cert/server.crt` 格式
私钥匹配 签名证书和加密证书的私钥可能相同也可能不同,具体视国密模块的实现而定
密码套件 `ssl_ciphers` 中必须包含国密套件(如 `ECC-SM4-SM3`、`SM2-WITH-SMS4-SM3` 等)
Tengine 配置注意 Tengine 2.4.1 之前的版本需将 `ngx_tongsuo_ntls` 替换为 `ngx_openssl_ntls`
验证命令 配置完成后建议使用 `nginx -t` 检查语法,再使用 `systemctl restart nginx` 重启服务。测试国密连接时,可使用 `openssl s_client -connect yourdomain.com:443 -cipher ECC-SM4-SM3` 指定国密套件进行握手验证
五、必备环境
官方 Nginx 主线版本不原生支持 SM2/SM3/SM4 等国产密码算法,部署国密 SSL 前需要以下任一方案:
Tengine + Tongsuo(铜锁/BabaSSL)组合:阿里云提供的集成方案,Tongsuo 适配了 NTLS 国密 TLS 全部特性
自编译 Nginx + GmSSL:下载 GmSSL 源码,替换 OpenSSL 后重新编译 Nginx,同时需要额外国密 SSH 模块(如 nginx-gm)
Nginx-with-openHiTLS:基于 openHiTLS 密码库的原生国密版本
沃通国密模块(wotrus_ssl):沃通提供的专业 SM2 国密模块,支持 Linux 和 Windows 平台
注意:国密 SSL证书的有效性验证依赖于国密浏览器(如红莲花、奇安信等)预埋的国密 CA 信任链,普通浏览器无法直接识别国密证书。