Назад | Перейти на главную страницу

Требуется сертификат клиента, выданный определенным промежуточным ЦС в Apache

У меня есть такая иерархия 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") }