nginx通过ssl_crl实现mtls下客户端证书吊销拦截,需同时满足ssl_verify_client on、ssl_client_certificate指定同源ca、crl为pem格式且未过期,更新后原子替换文件即可生效。

要防止已吊销的客户端证书越权访问,Nginx 必须在双向 TLS(mTLS)场景中启用静态吊销校验,核心是正确配置 ssl_crl 指令——它本身不“实时”联网检查,但能高效拦截已被 CA 列入吊销列表的客户端证书。
必须同时满足的三个前提条件
ssl_crl 不会单独起作用,缺一不可:
- 开启双向认证:
ssl_verify_client on;—— 否则 Nginx 根本不读取客户端证书,ssl_crl完全被忽略 - 指定可信根 CA:
ssl_client_certificate /path/to/ca-bundle.pem;—— 用于验证客户端证书签名链,也作为 CRL 签名验证的信任锚点 - CRL 文件由同一 CA 签发:若客户端证书由中间 CA 签发,CRL 必须由该中间 CA 或其上级 CA 签署,否则 OpenSSL 校验失败,Nginx 启动或重载时报错
确保 CRL 文件可用且有效
Nginx 只接受 PEM 格式、未过期、权限正确的 CRL 文件:
- 格式转换:CA 提供的 DER 格式需转为 PEM:
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 拒绝加载 - 权限设置:文件属主应为 Nginx 工作进程用户(如
www-data),权限设为644,避免 “Permission denied” 错误
配置写法与关键细节
将以下指令放入 server 块内(不能仅放在 http 块中):
-
ssl_client_certificate /etc/nginx/ssl/ca-bundle.pem;—— 必填,定义信任根 -
ssl_verify_client on;—— 必填,激活客户端证书校验 -
ssl_crl /etc/nginx/ssl/ca.crl.pem;—— 绝对路径,指向 PEM 格式吊销列表 -
ssl_verify_depth 2;—— 推荐显式设置,尤其当客户端证书经中间 CA 签发时,避免因默认深度为 1 导致链校验失败
注意:Nginx 不自动刷新内存中的 CRL 内容。更新 CRL 文件后,可通过原子替换(如 mv new.crl.pem crl.pem)使新连接立即生效,无需 nginx -s reload;但若文件内容未真正更新或路径错误,拦截不会触发。
验证是否真正生效
最直接方式是用已被吊销的客户端证书发起新连接:
- 正常证书访问应返回 HTTP 200,且可配合
add_header X-Client-Verify $ssl_client_verify;查看响应头是否为SUCCESS - 吊销证书访问会在 TLS 握手阶段立即失败,客户端通常报
SSL_ERROR_BAD_CERTIFICATE,Nginx error log 中出现certificate revoked或SSL_do_handshake() failed - 若仍能访问,优先排查:
ssl_verify_client是否关闭、CRL 路径是否拼写错误、文件权限是否受限、CRL 是否已过期或格式非法











