Nginx原生不支持国密证书OCSP Stapling,因OpenSSL未实现SM2/SM3的OCSP请求构造、响应解析与验签;需改用ssl_stapling_file配合gmssl手动获取并验证响应。

Nginx 原生不支持国密(SM2/SM3/SM4)证书的 OCSP Stapling。这不是配置写错的问题,而是 OpenSSL(截至 3.0.x)和 Nginx 当前版本对国密算法栈缺乏完整 OCSP 协议层支持:OCSP 请求构造、响应解析、签名验签(SM2 签名 + SM3 摘要)均未被实现。因此,无论你怎么配 ssl_stapling on 或 ssl_stapling_verify on,对国密证书都必然静默失效。
国密证书无法启用自动 OCSP Stapling 的根本原因
- OpenSSL 主流发行版(含 RHEL/CentOS/Ubuntu 官方源)未启用国密引擎或未集成
gmssl扩展,不识别id-sm2OID 和sm3WithSM2签名算法 - Nginx 调用 OpenSSL 的
OCSP_sendreq_new和OCSP_response_verify接口时,遇到国密 OCSP 响应会直接返回NULL或parse error,且不记录日志 - 国密 CA 颁发的证书中 AIA 扩展虽可能含
OCSP - URI: http://ocsp.gmca.cn,但该地址返回的响应体使用 SM2 签名+SM3 摘要,OpenSSL 默认无法校验
可行替代方案:手动缓存 + 严格离线验证
必须放弃自动拉取,改用 ssl_stapling_file + 自定义国密工具链验证:
-
保留必要指令组合
ssl_stapling on; # 仍需开启,否则 stapling_file 不生效 ssl_stapling_verify on; # 启用验证逻辑(Nginx 会尝试调用 OpenSSL 验签) ssl_stapling_file /etc/nginx/ocsp/gmcert.ocsp; ssl_trusted_certificate /etc/nginx/ssl/gm-ca-chain.pem; # 仅含国密根 + 中间证书,顺序:中间在前、根在后
-
生成合法 OCSP 响应文件的关键步骤
- 使用支持国密的工具(如
gmssl或经国密改造的openssl-gm)获取响应:gmssl ocsp -issuer gm-intermediate.crt -cert example.sm2.crt \ -url http://ocsp.gmca.cn \ -respout /etc/nginx/ocsp/gmcert.ocsp \ -text - 验证响应有效性(必须通过):
gmssl ocsp -respin /etc/nginx/ocsp/gmcert.ocsp \ -CAfile /etc/nginx/ssl/gm-ca-chain.pem \ -verify_other gm-intermediate.crt \ -text输出含
Response verify OK才可被 Nginx 接受
- 使用支持国密的工具(如
-
确保信任链文件完全合规
/etc/nginx/ssl/gm-ca-chain.pem必须满足:- 仅包含国密中间 CA 证书(签发你站点证书的那个)和国密根 CA 证书
- 不能含站点证书(
example.sm2.crt)、不能混入 RSA 证书、不能含私钥 - 两证书按 PEM 格式拼接,中间证书在上、根证书在下
验证是否真正生效
- 用支持国密的客户端(如
gmssl s_client)实测:gmssl s_client -connect example.sm2:443 -status -servername example.sm2 2>&1 | grep -A5 "OCSP response"
成功时显示
OCSP response: successful (0x0)和CertStatus: good - 查看 Nginx error log,搜索
stapling,若出现no response sent或verify failed,说明gmssl生成的响应未被 OpenSSL(Nginx 调用的)识别,需回退到纯国密网关层处理
不复杂但容易忽略


















