要求 Apache 中特定的中间 CA 颁发的客户端证书

要求 Apache 中特定的中间 CA 颁发的客户端证书

我有一个像这样的CA层次结构:

               根证书颁发机构
          ________|_____________
         | |
      测试-CA 生产-CA
    _____|_____ ____|____
   | | | |
测试-SRV 测试-CLI 产品-SRV 产品-CLI

从 PROD-SRV 服务器证书标识的生产服务器的角度来看,我该如何设置 Apache mod_ssl 以要求由 PRODUCTION-CA 签名的 PROD-CLI 客户端证书,而不允许客户端使用由 TEST-CA 签名的 TEST-CLI 证书?


目前我有:

SSL证书文件prod_srv.crt
SSL证书密钥文件 prod_srv.pem
SSLCADNRequestFile prod_ca.crt
SSLCACertificate文件root_ca.crt

这看起来是可行的,因为服务器向浏览器要求提供 PROD CLI 证书,但如果我提供 TEST CLI 证书,则会构建有效的证书路径,并且测试客户端会被接受到生产系统中。

答案1

看看SSL要求指令 - 以下规则应查看所提供证书的颁发者字段(即 CA 证书),挑选出 CN,并将其与 PRODUCTION-CA 证书的名称进行匹配。

SSLRequire %{SSL_CLIENT_I_DN_CN} == "PRODUCTION-CA"

答案2

我想使用中间 CA 的子 CA 颁发的证书对客户端进行身份验证,如下所示:

               Root-CA
                  |
            Intermediate-CA
          ________|_____________
         |                      |
      SUB-CA 1               SUB-CA 2
    _____|_____             ____|____
   |           |           |         |
TEST-SRV   TEST-CLI    PROD-SRV   PROD-CLI

您可以使用 SSL_CLIENT_CERT_CHAIN_n 变量来检查链,例如执行以下操作:

SSLRequireSSL
SSLVerifyClient require
SSLCACertificateFile ".../root-ca.cert.pem"
Require expr %{SSL_CLIENT_CERT_CHAIN_1} == file(".../intermediate.cert.pem")

甚至多个一级中级 CA:

Require expr %{SSL_CLIENT_CERT_CHAIN_1} in { file(`".../intermediate.cert.pem"), file(".../intermediate2.cert.pem") }

相关内容