nginx不支持CRL实时下载与动态更新,ssl_crl仅静态加载PEM格式CRL文件;生效前提为ssl_verify_client on且配置ssl_client_certificate,仅校验客户端证书吊销状态。

nginx 本身不支持“实时”下载或动态更新 CRL,ssl_crl 指令只做静态文件加载与校验。它不会自动拉取新版本、不检查 Next Update 时间戳是否过期、也不触发后台刷新。所谓“实时封禁”,本质是靠你手动更新 CRL 文件 + 重载 Nginx 配置来实现的快速响应。
ssl_crl 的生效前提和限制
这个指令只在启用双向 TLS 认证时起作用:
- 必须配置
ssl_verify_client on;,否则 ssl_crl 完全被忽略 - 必须同时指定
ssl_client_certificate(CA 公钥),用于验证客户端证书签名 - 仅校验客户端证书是否被吊销,对 nginx 自身的服务器证书(ssl_certificate)无效
- CRL 文件必须是 PEM 格式,含
-----BEGIN X509 CRL-----和-----END X509 CRL-----标记
CRL 文件准备与维护要点
不能靠“生成一次就一劳永逸”,CRL 有明确有效期(Next Update 字段),过期后 Nginx 启动或重载会报错并拒绝加载:
- 从 CA 官网获取 CDP(CRL Distribution Points)URL,用 curl 下载最新 PEM 版本
- 用
openssl crl -in crl.pem -noout -nextupdate查看下次更新时间,建议设置定时任务提前 2 小时更新 - 权限设为
644,属主为 nginx 运行用户(如 www-data 或 nginx) - 若多个站点使用不同 CA,每个站点需独立配置对应 CRL 路径,不可共用一个文件
配置示例与常见失败原因
典型 server 块中应包含以下几行(顺序无关,但缺一不可):
ssl_verify_client on; ssl_client_certificate /etc/nginx/ssl/ca-bundle.pem; ssl_crl /etc/nginx/ssl/example-ca.crl.pem;
常见问题包括:
- Nginx 报
invalid CRL file:CRL 文件不是 PEM 格式,或已损坏、为空 - 客户端证书明明被吊销却仍能访问:未启用
ssl_verify_client,或 CRL 文件路径写错/权限不足 - 重载后无效果:CRL 文件内容未真正更新(比如 wget 覆盖失败、缓存了旧版本)
- 日志里出现
error reading CRL:文件路径不存在,或 OpenSSL 无法解析(例如用了 DER 格式却没转 PEM)
如何验证 CRL 是否生效
不需要等真实吊销事件,可用测试手段快速确认流程通路:
- 用 openssl 手动吊销一个测试客户端证书:
openssl ca -revoke client.crt -config openssl.cnf,再重新生成 CRL - 用已吊销的客户端证书发起请求:
curl --cert revoked-client.pem --key revoked-key.pem https://yoursite.com - 成功时返回
400 Bad Request或直接断连,Nginx error log 中应出现certificate revoked类提示 - 浏览器访问时若弹出“证书已被吊销”,说明客户端也启用了 CRL 检查(非默认行为,仅部分企业环境启用)


















