我有一个像这样的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") }