У меня есть такая иерархия CA:
Root-CA ________|_____________ | | TEST-CA PRODUCTION-CA _____|_____ ____|____ | | | | TEST-SRV TEST-CLI PROD-SRV PROD-CLI
С точки зрения производственного сервера, идентифицированного сертификатом сервера PROD-SRV, как мне настроить Apache mod_ssl так, чтобы он запрашивал сертификат клиента PROD-CLI, подписанный PRODUCTION-CA, и не позволял клиенту с сертификатом TEST-CLI, подписанным ТЕСТ-СА?
На данный момент у меня есть:
SSLCertificateFile prod_srv.crt SSLCertificateKeyFile prod_srv.pem SSLCADNRequestFile prod_ca.crt SSLCACertificateFile root_ca.crt
Похоже, это работает, потому что сервер запрашивает у браузера сертификат PROD CLI, но если я предоставлю сертификат TEST CLI, создается действительный путь сертификата, и тестовый клиент принимается в производственной системе.
Посмотрите в SSLRequire директива - следующее правило должно смотреть на поле Issuer (то есть сертификат CA) представленного сертификата, выбирать CN и сопоставлять его с именем вашего сертификата PRODUCTION-CA.
SSLRequire %{SSL_CLIENT_I_DN_CN} == "PRODUCTION-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")
или даже несколько промежуточных центров сертификации первого уровня:
Require expr %{SSL_CLIENT_CERT_CHAIN_1} in { file(`".../intermediate.cert.pem"), file(".../intermediate2.cert.pem") }