关键不是绑定私钥,而是确保私钥与证书的算法类型、用途严格匹配,并由同一套国密增强OpenSSL(如GmSSL或Tongsuo)驱动解析;国密双证书要求签名证书配签名私钥、加密证书配加密私钥,两套密钥对必须独立生成且不可复用。
配置国密 SSL 证书时,关键不是“绑定私钥”,而是确保私钥与证书的算法类型、用途严格匹配,并由同一套国密增强 OpenSSL(如 GmSSL 或 Tongsuo)驱动解析。原生 Nginx 不识别 SM2 私钥格式,必须依赖底层密码库正确加载和使用。
国密双证书体系要求两套独立密钥对:
domain_sign.crt)必须配对使用 签名私钥(domain_sign.key),该私钥仅用于数字签名(身份认证),不可用于密钥交换;domain_enc.crt)必须配对使用 加密私钥(domain_enc.key),该私钥仅用于 SM2 密钥协商(ECDH),不可用于签名;使用 GmSSL 工具检查私钥合法性(非 OpenSSL 原生命令):
/usr/local/gmssl/bin/gmssl pkey -in domain_sign.key -text -noout,输出中应含 sm2 字样且无解析错误;unable to load key 或显示 rsa/ec,说明私钥非 SM2 格式,或被错误转码(如 PEM 头尾误写为 BEGIN RSA PRIVATE KEY);-----BEGIN EC PRIVATE KEY----- 或 -----BEGIN PRIVATE KEY-----(GmSSL v2.5+ 支持后者),且内部 OID 必须为 1.2.156.10197.1.301(SM2 标识)。在 server 块中,用专用指令加载国密双证书(注意:不是用 ssl_certificate 和 ssl_certificate_key 简单替换):
ssl_certificate /path/to/domain_sign_bundle.crt;
ssl_certificate_key /path/to/domain_sign.key;
ssl_certificate_enc /path/to/domain_enc_bundle.crt;(需 GmSSL/Nginx 补丁支持该指令)ssl_certificate_key_enc /path/to/domain_enc.key;
ssl_certificate_sm2_sign 和 ssl_certificate_sm2_enc,具体取决于编译时启用的模块。即使配置路径正确,若 Nginx 实际链接了系统 OpenSSL,SM2 私钥将被忽略或报错:
ldd $(which nginx) | grep ssl,确认指向 /usr/local/gmssl/lib/libssl.so.1.1;ln -sf /usr/local/gmssl/lib/libssl.so.1.1 /usr/lib64/libssl.so.1.1;SSL_CTX_use_PrivateKey_file failed 或 unknown algorithm,大概率是底层库不支持 SM2。