ssl_crl仅在mTLS中通过静态CRL文件比对实现吊销拦截,需同时满足ssl_verify_client on、ssl_client_certificate指定可信CA、CRL由同一CA签发三个前提,更新后必须nginx -s reload。

ssl_crl 本身不提供真正意义上的“实时”吊销拦截——它做的是静态文件比对,所谓“实时”取决于你能否及时更新 CRL 文件并重载 Nginx。它只在双向 TLS(mTLS)场景中生效,用于拒绝已被 CA 吊销的客户端证书连接,在握手阶段就切断,不进入 HTTP 层。
必须满足的三个启用前提
ssl_crl 不会单独起作用,以下三项缺一不可:
-
开启客户端证书校验:配置
ssl_verify_client on(或optional),否则 Nginx 根本不读取客户端证书,ssl_crl被完全忽略 -
指定可信 CA 公钥:用
ssl_client_certificate指向签发客户端证书的根或中间 CA 证书(PEM 格式),这是验证证书签名链和 CRL 签名的信任锚点 -
CRL 由同一 CA 签发:CRL 文件必须由
ssl_client_certificate所指 CA 或其下属中间 CA 签发,否则 Nginx 启动时校验失败,报错退出
CRL 文件准备与维护要点
Nginx 只接受 PEM 格式、未过期、权限正确的 CRL 文件:
- 确保内容以
-----BEGIN X509 CRL-----开头,-----END X509 CRL-----结尾;若 CA 提供 DER 格式,用命令转换:openssl crl -inform DER -in ca.crl.der -outform PEM -out ca.crl.pem - 检查有效期:
openssl crl -in ca.crl.pem -noout -nextupdate,当前时间必须早于 “Next Update” 时间,否则 Nginx 重载会失败 - 设为可读权限:
chmod 644 /etc/nginx/ssl/ca.crl.pem,属主需为 Nginx 工作进程用户(如www-data或nginx) - 建议通过定时任务自动更新,例如每小时拉取:
wget -O /etc/nginx/ssl/ca.crl.pem https://ca.example.com/crl.pem
Nginx 配置写法与生效方式
将以下指令放入 server 块内(不能只放在 http 块):
ssl_client_certificate /etc/nginx/ssl/ca.crt;ssl_verify_client on;ssl_crl /etc/nginx/ssl/ca.crl.pem;- 推荐显式添加:
ssl_crl_check all;(确保检查整条证书链中任一证书是否被吊销) - 若客户端证书经中间 CA 签发,加:
ssl_verify_depth 2;或更高
注意:更新 CRL 文件后必须执行 nginx -s reload,Nginx 不会自动重读 CRL 内容;仅修改文件内容而不重载,新吊销项不会生效。
验证拦截是否生效
最直接的方式是用已吊销和未吊销的客户端证书分别测试:
- 用有效证书访问,应成功建立 TLS 连接,响应中可加头确认:
add_header X-Client-Verify $ssl_client_verify;→ 显示SUCCESS - 用已被 CA 吊销的证书访问,连接会在 TLS 握手阶段中断,客户端通常报
SSL_ERROR_BAD_CERTIFICATE,Nginx 错误日志出现SSL_do_handshake() failed及类似提示 - 语法检查勿跳过:
nginx -t成功后再 reload,避免因路径错误或权限问题导致配置未实际加载

















