一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Nginx 如何在 Nginx 中配置国密 SSL 证书时正确绑定对应的国密私钥与算法

时间:2026-08-12 12:01:48 编辑:袖梨 来源:一聚教程网

关键不是绑定私钥,而是确保私钥与证书的算法类型、用途严格匹配,并由同一套国密增强OpenSSL(如GmSSL或Tongsuo)驱动解析;国密双证书要求签名证书配签名私钥、加密证书配加密私钥,两套密钥对必须独立生成且不可复用。

配置国密 SSL 证书时,关键不是“绑定私钥”,而是确保私钥与证书的算法类型、用途严格匹配,并由同一套国密增强 OpenSSL(如 GmSSL 或 Tongsuo)驱动解析。原生 Nginx 不识别 SM2 私钥格式,必须依赖底层密码库正确加载和使用。

确认私钥与证书的算法和用途一一对应

国密双证书体系要求两套独立密钥对:

  1. 签名证书(如 domain_sign.crt)必须配对使用 签名私钥domain_sign.key),该私钥仅用于数字签名(身份认证),不可用于密钥交换;
  2. 加密证书(如 domain_enc.crt)必须配对使用 加密私钥domain_enc.key),该私钥仅用于 SM2 密钥协商(ECDH),不可用于签名;
  3. 两套私钥必须分别生成,不能复用同一 SM2 密钥对——这是 GM/T 0024 标准强制要求,也是等保测评否决项。

验证私钥是否为标准 SM2 格式

使用 GmSSL 工具检查私钥合法性(非 OpenSSL 原生命令):

  1. 执行 /usr/local/gmssl/bin/gmssl pkey -in domain_sign.key -text -noout,输出中应含 sm2 字样且无解析错误;
  2. 若提示 unable to load key 或显示 rsa/ec,说明私钥非 SM2 格式,或被错误转码(如 PEM 头尾误写为 BEGIN RSA PRIVATE KEY);
  3. 正确 SM2 私钥 PEM 头应为 -----BEGIN EC PRIVATE KEY----------BEGIN PRIVATE KEY-----(GmSSL v2.5+ 支持后者),且内部 OID 必须为 1.2.156.10197.1.301(SM2 标识)。

Nginx 配置中明确指定两套证书+私钥路径

在 server 块中,用专用指令加载国密双证书(注意:不是用 ssl_certificatessl_certificate_key 简单替换):

  1. 签名证书链:ssl_certificate /path/to/domain_sign_bundle.crt;
  2. 签名私钥:ssl_certificate_key /path/to/domain_sign.key;
  3. 加密证书链:ssl_certificate_enc /path/to/domain_enc_bundle.crt;(需 GmSSL/Nginx 补丁支持该指令)
  4. 加密私钥:ssl_certificate_key_enc /path/to/domain_enc.key;
  5. 若使用 Tongsuo,则对应指令为 ssl_certificate_sm2_signssl_certificate_sm2_enc,具体取决于编译时启用的模块。

确保 Nginx 调用的是国密版 OpenSSL 动态库

即使配置路径正确,若 Nginx 实际链接了系统 OpenSSL,SM2 私钥将被忽略或报错:

  1. 启动前执行 ldd $(which nginx) | grep ssl,确认指向 /usr/local/gmssl/lib/libssl.so.1.1
  2. 避免系统冲突:安装 GmSSL 后立即建立软链接 ln -sf /usr/local/gmssl/lib/libssl.so.1.1 /usr/lib64/libssl.so.1.1
  3. 检查 Nginx 错误日志,出现 SSL_CTX_use_PrivateKey_file failedunknown algorithm,大概率是底层库不支持 SM2。

热门栏目