ssl_crl指令仅在启用双向TLS认证(ssl_verify_client on)时生效,用于验证客户端证书是否被CA吊销,需配合ssl_client_certificate使用,且CRL文件必须为PEM格式并定期更新。

ssl_crl 指令用于在 Nginx 的 HTTPS 服务中启用客户端或服务端证书吊销状态检查,它告诉 Nginx 使用指定的 CRL(Certificate Revocation List,证书吊销列表)文件来验证证书是否已被签发机构主动作废。但要注意:该指令仅在使用 ssl_verify_client on(即开启双向 TLS 认证)时才生效,且只作用于客户端证书验证环节;它不用于验证 Nginx 自身的服务器证书是否被吊销。
一、CRL 文件准备与格式要求
CRL 是由 CA(证书颁发机构)定期发布的一种签名数据结构,列出了已撤销但尚未过期的证书序列号。Nginx 要求 CRL 文件必须是 PEM 格式(Base64 编码 + BEGIN/END 标记),不能是 DER 或其他二进制格式。
- 若 CA 提供的是 DER 格式 CRL(如 crl.der),可用 OpenSSL 转换:
openssl crl -inform DER -in crl.der -outform PEM -out crl.pem - 确保 CRL 文件可被 Nginx 进程读取(权限建议为 644,属主为 nginx 运行用户,如 www-data 或 nginx)
- 推荐定期更新 CRL 文件(例如通过 cron + wget/curl 下载最新版本),因为 CRL 本身有有效期(Next Update 字段),过期后 Nginx 将拒绝加载并报错
二、Nginx 配置 ssl_crl 的典型写法
该指令必须放在 server 块或 http 块中,且需配合 ssl_client_certificate 和 ssl_verify_client 才能起效:
server {
listen 443 ssl;
server_name example.com;
<pre class="brush:php;toolbar:false;">ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
# 指定客户端证书的根 CA 公钥(必填)
ssl_client_certificate /etc/nginx/ssl/ca.crt;
# 启用客户端证书校验(必填,否则 ssl_crl 不触发)
ssl_verify_client on;
# 指向 PEM 格式的 CRL 文件(可选,但启用吊销检查必须配置)
ssl_crl /etc/nginx/ssl/ca.crl.pem;
# 可选:设置校验深度(默认 1,即只校验客户端证书是否直连 CA 签发)
ssl_verify_depth 2;
location / {
# 若校验失败(如证书被吊销),Nginx 默认返回 400 错误
# 可用 $ssl_client_verify 变量在日志或响应头中记录结果
add_header X-Client-Verify $ssl_client_verify;
}}
三、验证 CRL 是否生效的关键方法
光看配置不等于吊销检查真在运行。需结合日志与实测确认:
- 检查 Nginx 启动日志:若 CRL 文件路径错误、格式非法或已过期,会报类似 "SSL_CTX_use_crl_file() failed" 的错误
- 用 openssl 命令手动检查 CRL 内容和时效:
openssl crl -in ca.crl.pem -text -noout → 查看 Next Update 时间是否早于当前时间 - 构造测试场景:用一个已被 CA 吊销的客户端证书发起请求,观察 Nginx 是否返回 400(或 495,取决于 error_page 配置),同时检查
$ssl_client_verify变量值是否为 FAILED - 注意:Nginx 不支持 OCSP Stapling 替代 CRL,也不支持动态拉取 CRL(需自行脚本更新文件)
四、常见问题与避坑提示
-
“配置了 ssl_crl 却没效果”:最常见原因是未启用
ssl_verify_client,或ssl_client_certificate指向了错误的 CA 证书(必须与签发客户端证书的 CA 一致) - CRL 更新不及时导致误拦:CA 发布新 CRL 后,旧 CRL 过期即失效;建议搭配监控脚本检查文件修改时间与 Next Update 字段
- 性能影响:CRL 加载发生在 worker 进程启动时,不增加单次请求开销;但大体积 CRL(如含数万条记录)可能延长 reload 时间
- 不支持多级 CRL 或 Delta CRL:Nginx 仅接受单一完整 CRL 文件,不识别增量更新机制

















