ssl_crl 实现客户端证书吊销静态拦截,需同时启用 ssl_verify_client、指定 ssl_client_certificate 和匹配 ca 签发的 pem 格式 crl 文件,更新后须重载配置生效。

配置 ssl_crl 实现对吊销客户端证书的静态拦截,本质是在 Nginx 的双向 TLS(mTLS)流程中,于 TLS 握手阶段主动比对客户端证书是否出现在指定的 CRL 文件中。匹配即拒连,不进入 HTTP 请求处理逻辑,属于“零信任式”静态拦截。
必须满足的三个前提条件
该指令不会单独生效,缺一不可:
-
启用双向认证:必须设置
ssl_verify_client on,否则 Nginx 根本不校验客户端证书,ssl_crl完全被忽略 -
指定可信根 CA:必须通过
ssl_client_certificate指向签发客户端证书的根 CA 公钥(PEM 格式),用于验证证书签名链 -
CRL 文件由同一 CA 签发:CRL 必须由
ssl_client_certificate所指 CA 或其下属中间 CA 签发,否则签名验证失败,Nginx 启动报错或拒绝加载
CRL 文件准备与格式要求
Nginx 只接受 PEM 格式的 CRL 文件,内容需以 -----BEGIN X509 CRL----- 开头、-----END X509 CRL----- 结尾。常见问题及处理方式:
- 若 CA 提供的是 DER 格式(如
ca.crl),用 OpenSSL 转换:openssl crl -inform DER -in ca.crl -outform PEM -out ca.crl.pem - 文件权限设为
644,属主为 Nginx 运行用户(如www-data或nginx),避免启动时报 “Permission denied” - 检查 CRL 是否过期:
openssl crl -in ca.crl.pem -noout -nextupdate,确保当前时间早于Next Update时间点
Nginx 配置写法与关键细节
将以下指令放入 server 块内(不能只放在 http 块中,除非所有 server 都统一启用 mTLS):
-
ssl_client_certificate /etc/nginx/ssl/ca.crt;—— 必填,定义信任锚点 -
ssl_verify_client on;—— 必填,激活客户端证书校验流程 -
ssl_crl /etc/nginx/ssl/ca.crl.pem;—— 指定吊销列表路径,启用静态吊销检查 -
ssl_verify_depth 2;—— 推荐显式设置,尤其当客户端证书经中间 CA 签发时,避免因默认深度为 1 导致链校验失败
注意:Nginx 不支持自动刷新 CRL 内存缓存,更新 CRL 文件后需重载配置(nginx -s reload)才能生效。
验证拦截是否真正生效
最直接的验证方式是使用已被吊销的客户端证书发起请求:
- 正常未吊销证书访问返回 200,且响应头中可看到
X-Client-Verify: SUCCESS(需配合add_header X-Client-Verify $ssl_client_verify;) - 吊销证书访问会立即在 TLS 握手阶段失败,客户端收到
SSL_ERROR_BAD_CERTIFICATE或 Nginx 返回 400 错误,日志中出现SSL_do_handshake() failed及certificate revoked提示 - 可通过
openssl s_client -connect example.com:443 -cert revoked.crt -key revoked.key -CAfile ca.crt手动测试,观察输出中是否含Verify return code: 23 (certificate revoked)











