SSLCARevocationCheck 必须配合 SSLVerifyClient require 才生效,单独设置无效;其值仅支持 none、chain、leaf,且需同时配置 SSLCACertificateFile/Path,否则握手失败。

SSLCARevocationCheck 指令必须配合 SSLVerifyClient require 才生效
单独设置 SSLCARevocationCheck 不会触发任何吊销检查——Apache 只在启用客户端证书验证(双向认证)且成功完成信任链构建后,才考虑是否查 CRL 或 OCSP。如果你只配了 SSLCARevocationCheck 但没设 SSLVerifyClient require,它完全被忽略。
常见错误现象:SSLVerifyClient optional 下即使开了 SSLCARevocationCheck,日志里也看不到 CRL 加载失败或 OCSP 超时,因为验证流程根本没走到吊销环节。
-
SSLVerifyClient require是硬性前提,缺一不可 - 必须同时配置
SSLCACertificateFile(或SSLCACertificatePath),否则握手直接失败,报错SSL Library Error: error:140890C7:SSL routines:ssl3_get_client_certificate:peer did not return a certificate -
SSLCARevocationCheck的值仅支持none、chain、leaf,不支持on/off或布尔值
SSLCARevocationCheck chain 和 leaf 的实际行为差异
两者都要求 OpenSSL ≥ 1.0.2,但校验粒度不同:
-
chain:对整个证书链中每个非根证书(包括中间 CA)都查吊销状态;开销大,易因某一级中间 CRL 不可用而失败 -
leaf:只查终端客户端证书的吊销状态,跳过中间 CA 的 CRL/OCSP 查询;更轻量,也是多数企业场景的合理选择 - 无论选哪个,都**不自动下载或刷新** CRL/OCSP 响应;CRL 文件需手动更新,OCSP 响应依赖
SSLOCSPEnable on+ 缓存机制
示例配置片段:
SSLVerifyClient require SSLCACertificateFile /etc/ssl/certs/ca-bundle.crt SSLCARevocationCheck chain SSLOCSPEnable on
为什么 SSLCARevocationFile 几乎没人用
SSLCARevocationFile 看似直观(指定单个 CRL PEM 文件),但它在 Apache 2.4.x 中存在严重限制:
- 只在 OpenSSL 编译时启用了
OPENSSL_NO_CRL以外的选项时才有效,而多数发行版默认禁用该功能 - 即使启用,它也无法处理分段 CRL(如增量 CRL)、多签名 CRL,且不支持 OCSP
- 更关键的是:mod_ssl 实际调用 OpenSSL 的
X509_STORE_set_flags()时,并未把SSLCARevocationFile映射为有效 store flag,导致该指令常被静默忽略
真实生产环境几乎都绕过它,改用:SSLCARevocationPath(配合 c_rehash)或直接上 SSLOCSPEnable。
SSLCARevocationPath 配置最容易踩的三个坑
SSLCARevocationPath 是目前唯一稳定支持 CRL 吊销检查的方式,但路径格式极敏感:
- 目录下不能放原始 CRL 文件,必须先用
c_rehash /path/to/crl/dir生成哈希符号链接(如abcd1234.r0);漏这步,Apache 启动时无报错,但吊销检查永不触发 - 该目录**不能和**
SSLCACertificatePath共用——Apache 会混淆证书与 CRL 文件,导致验证失败或 segfault - CRL 文件本身必须是 PEM 格式,且以
-----BEGIN X509 CRL-----开头;DER 格式或 base64 编码不完整(缺尾部换行)都会让c_rehash生成空链接
复杂点在于:CRL 过期时间、分发延迟、网络可达性全由运维控制,而 Apache 不提供自动刷新机制——你得自己写 cron 定期 wget 新 CRL 并 c_rehash。











