在国密SSL(GMSSL)环境中,Nginx的配置与标准HTTPS有显著区别,核心在于双证书体系(签名证书 + 加密证书)。以下是标准国密Nginx(基于GmSSL或Tongsuo补丁)中这两类证书的路径指定方法和关键注意事项。
1. 核心配置指令
在国密Nginx的`server`块中,使用以下4个独立指令分别指定路径:
配置项 指令名称 作用
签名证书(公钥) `ssl_certificate` 指定签名证书文件(含公钥)路径
签名私钥 `ssl_certificate_key` 指定签名证书对应的私钥路径
加密证书 (公钥) `ssl_enc_certificate` 指定加密证书文件(含公钥)路径(国密特有)
加密私钥 `ssl_enc_certificate_key` 指定加密证书对应的私钥路径(国密特有)
2. 标准配置示例
nginx
server {
listen 443 ssl;
server_name your-domain.com;
签名证书与私钥(用于身份认证)
ssl_certificate /etc/nginx/ssl/sign_cert.pem;
ssl_certificate_key /etc/nginx/ssl/sign_key.pem;
加密证书与私钥(用于密钥协商,国密双证书体系必须配置)
ssl_enc_certificate /etc/nginx/ssl/enc_cert.pem;
ssl_enc_certificate_key /etc/nginx/ssl/enc_key.pem;
其余常规SSL配置(需指定国密套件)
ssl_protocols TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-SM2-WITH-SMS4-GCM-SM3:ECDHE-SM2-WITH-SMS4-CBC-SM3;
...
}
3. 路径指定时的关键注意事项(极易踩坑)
绝对路径优先:强烈建议使用绝对路径(如 `/etc/nginx/ssl/...`),避免因Nginx启动时的工作目录(如 `/etc/nginx/`)与相对路径混淆导致 `No such file or directory` 错误。
文件格式必须为 PEM:证书和私钥文件必须为 `.pem` 或 `.crt`/`.key` 的 Base64(PEM)格式,不支持DER二进制格式。
权限控制(`ssl_certificate_key` 与 `ssl_enc_certificate_key`):
私钥文件权限必须严格限制,建议设为 `600` 或 `640`。
确保Nginx工作进程(如 `www-data` 或 `nginx` 用户)对私钥文件及其父目录拥有读取(r)权限。若父目录权限为 `700` 且属主非nginx用户,会导致 `Permission denied`。
证书链合并处理:
对于签名证书:若CA机构提供了中间证书,需要将服务器签名证书与中间证书按顺序合并到一个文件中,再指定给 `ssl_certificate`(例如:`cat sign_server.pem ca.pem > full_sign.pem`)。
- 对于加密证书:通常只需指定服务器加密证书本身,除非CA明确给出了加密证书的中间链,否则不要将签名证书的中间链混入加密证书文件中。
不要搞反文件位置:这是新手最常犯的错误——请务必核对文件名,确保 `sign`(签名)和 `enc`(加密)的证书/私钥没有交叉错配。错配会导致Nginx启动报错 `SSL_CTX_use_PrivateKey_file` 失败。
4. 验证配置是否生效
执行以下命令检测配置文件语法并测试实际加载:
bash
检查语法
nginx -t
若提示 "test is successful",重载生效
nginx -s reload
若启动失败,请立即查看错误日志定位问题:
bash
tail -f /var/log/nginx/error.log
常见报错:权限拒绝(permission denied)、找不到文件(No such file)、私钥不匹配(key values mismatch)
5. 特别补充:商业版差异
如果你使用的是商业国密Nginx版本(如阿里云Tengine、沃通Wosign、数通等),配置指令可能略有不同,常见变体为:
`gmssl_certificate` / `gmssl_certificate_key`
`ssl_sign_certificate` / `ssl_enc_certificate`
若上述标准指令 `ssl_enc_certificate` 无效,请查阅该商业版本的手册,或运行 `nginx -V` 查看编译参数中是否包含 `--with-gmssl` 等标志,确认底层库类型。
如果还需要了解国密双证书的生成流程(如使用 `gmssl` 命令行工具生成签名和加密密钥对),或者如何配置国密专用的 `ssl_ciphers` 套件,可以随时告诉我,我再为你展开。