ssl_crl配置仅在启用双向tls时生效,需配合ssl_verify_client on、ssl_client_certificate及合法pem格式crl文件;crl须签名有效、时间有效且序列号匹配,否则拒绝连接。

ssl_crl 配置本身不会自动“生效”,它只是告诉 Nginx 去加载并使用指定的 CRL(证书吊销列表)文件做客户端证书校验。真正起作用的是配合 ssl_verify_client on 和正确的证书链验证流程,且 CRL 文件必须满足格式、签名、时效等硬性要求。
ssl_crl 的作用范围与触发条件
ssl_crl 仅在启用双向 TLS(mTLS)时生效,即必须同时配置:
-
ssl_verify_client on或optional(仅on会强制校验吊销状态) -
ssl_client_certificate指向受信任的 CA 证书(用于验证客户端证书签名) -
ssl_crl指向 PEM 格式的 CRL 文件(由同一 CA 签发)
若未开启客户端证书验证,ssl_crl 完全被忽略,Nginx 启动也不会报错。
CRL 文件必须满足的三个关键前提
Nginx 加载 CRL 时不做在线查询,只做本地静态校验,因此文件本身必须合法:
-
格式正确:必须是 PEM 编码(以
-----BEGIN X509 CRL-----开头),不能是 DER 或其他编码 -
签名有效:CRL 必须由
ssl_client_certificate中指定的 CA 私钥签发,且其公钥能成功验签 -
时间有效:当前系统时间必须落在 CRL 的
nextUpdate时间之前,且晚于thisUpdate;过期的 CRL 被视为无效,Nginx 拒绝连接(日志提示certificate revoked或CRL has expired)
吊销检查的实际执行逻辑
当客户端提供证书后,Nginx 执行以下顺序校验:
- 用
ssl_client_certificate验证客户端证书签名是否可信 - 提取客户端证书的
serialNumber(注意:是十六进制无分隔符小写字符串,如023a7f) - 遍历 CRL 中所有
revokedCertificates条目,逐个比对 serialNumber - 若匹配且 CRL 有效,则拒绝连接,返回
400 Bad Request(或配置的 error_page)
不支持 OCSP Stapling,也不支持多个 CRL 文件拼接;若需管理多个 CA 的吊销列表,需合并为单个 PEM 文件(按顺序追加)。
调试与常见失败原因
可通过以下方式定位问题:
- 启动时加
-t只校验语法,不会验证 CRL 内容;真正的校验发生在首次 SSL 握手时 - 开启
error_log /path/to/log debug;,搜索crl、revoked、expired等关键词 - 用
openssl crl -in crl.pem -text -noout检查 CRL 是否可读、签名是否有效、时间是否在窗口内 - 确认客户端证书 serialNumber 与 CRL 中条目完全一致(OpenSSL 默认输出带冒号分隔,Nginx 匹配时不带)
不复杂但容易忽略。











