在Apache中配置证书吊销列表(CRL)主要涉及 `SSLCARevocationPath` 和 `SSLCARevocationFile` 这两个指令,它们分别用于指定CRL文件的存放目录和单一文件。
一、核心配置指令对比
特性 `SSLCARevocationPath` `SSLCARevocationFile`
作用 指定一个目录,该目录下存放多个PEM格式的CRL文件。 指定一个单一文件,该文件是多个PEM格式CRL文件的合并集。
适用场景 管理多个不同CA颁发的CRL,每个CA一个文件。 管理所有CA的CRL,合并到一个文件中,管理更简单。
配置方式 `SSLCARevocationPath /path/to/crl/directory/` `SSLCARevocationFile /path/to/ca-bundle.crl`
文件命名 文件需用CA证书主题的哈希值命名,并创建符号链接(如 `hash-value.r0`)。 无特殊命名要求,只需是一个PEM编码的合并文件。
更新维护 添加或更新CRL文件后,必须更新对应的符号链接。 添加或更新CRL时,需要重新生成整个合并文件。
二、启用CRL检查的关键指令
除了指定CRL位置,你还需要通过 `SSLCARevocationCheck` 指令显式启用吊销检查。从Apache 2.4.x开始,这是必须的步骤。
```apache
# 检查整个证书链(推荐)
SSLCARevocationCheck chain
# 仅检查客户端证书(叶子证书)
# SSLCARevocationCheck leaf
# 禁用CRL检查(默认)
# SSLCARevocationCheck none
```
使用 `chain` 或 `leaf` 时,Apache要求CRL文件必须存在且有效,否则验证会失败。
三、配置步骤详解
1. 准备CRL文件
从你的证书颁发机构(CA)获取最新的CRL文件(通常是 `.pem` 或 `.crl` 格式)。
2. 选择配置方法并放置文件
方法一:使用 `SSLCARevocationPath` (目录方式)
1. 将CRL文件放入指定目录,例如 `/etc/ssl/crl/`。
2. 创建符号链接:
计算CRL文件颁发者(Issuer)的哈希值:
```bash
openssl crl -in /path/to/your-ca.crl -hash -noout
# 假设输出为 a1b2c3d4
```
在CRL目录下创建符号链接:
```bash
cd /etc/ssl/crl/
ln -s your-ca.crl a1b2c3d4.r0
```
3. 在Apache配置文件中添加:
```apache
SSLCARevocationPath "/etc/ssl/crl/"
```
方法二:使用 `SSLCARevocationFile` (文件方式)
1. 将所有PEM格式的CRL文件内容按顺序合并到一个文件中:
```bash
cat crl1.pem crl2.pem > /path/to/ca-bundle.crl
```
2. 在Apache配置文件中添加:
```apache
SSLCARevocationFile "/path/to/ca-bundle.crl"
```
3. 完整的配置示例
这是一个同时配置了CRL目录和文件的示例,你通常选择其一即可。
```apache
<VirtualHost *:443>
ServerName www.example.com
SSLEngine on
SSLCertificateFile "/path/to/server.crt"
SSLCertificateKeyFile "/path/to/server.key"
# 客户端认证
SSLVerifyClient require
SSLVerifyDepth 3
SSLCACertificatePath "/etc/ssl/certs/"
# 方法一:指定CRL目录
SSLCARevocationPath "/etc/ssl/crl/"
# 方法二:指定CRL合并文件(与上一行二选一)
# SSLCARevocationFile "/etc/ssl/ca-bundle.crl"
# 启用CRL检查,检查整个证书链
SSLCARevocationCheck chain
</VirtualHost>
```
`SSLCARevocationPath` 和 `SSLCARevocationFile` 可以在 `server config` 或 `virtual host` 上下文中使用。
四、重要注意事项
文件权限:确保Apache进程用户(如 `www-data` 或 `apache`)对CRL目录和文件有读取权限。
定期更新:CRL有有效期,应建立自动化机制(如cron任务)定期从CA下载并更新文件。
故障排查:
配置完成后重启或重载Apache (`sudo systemctl reload apache2`)。
若客户端证书验证失败,检查Apache错误日志 (`error_log`) 中是否有 `unable to get CRL` 或 `certificate revoked` 等提示。
确认 `SSLCARevocationCheck` 已启用且CRL文件有效未过期。
如果对实时性要求更高,可以考虑使用 OCSP (Online Certificate Status Protocol) 作为CRL的替代方案。