在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的替代方案。