Requerendo certificado de cliente emitido por uma CA intermediária específica no Apache

3

Eu tenho uma hierarquia de CA como esta:

               Root-CA
          ________|_____________
         |                      |
      TEST-CA             PRODUCTION-CA
    _____|_____             ____|____
   |           |           |         |
TEST-SRV   TEST-CLI    PROD-SRV   PROD-CLI

Da perspectiva do servidor de produção identificado pelo certificado do servidor PROD-SRV, como configuraria o Apache mod_ssl para exigir o certificado de cliente PROD-CLI assinado pela PRODUCTION-CA e não permitir um cliente com o certificado TEST-CLI? assinado pelo TEST-CA?

Atualmente, tenho:

SSLCertificateFile      prod_srv.crt
SSLCertificateKeyFile   prod_srv.pem
SSLCADNRequestFile      prod_ca.crt
SSLCACertificateFile    root_ca.crt

Parece que está funcionando porque o servidor solicita ao navegador o certificado PROD CLI, mas se eu fornecer o certificado TEST CLI, um caminho de certificado válido será construído e um cliente de teste será aceito no sistema de produção.

    
por moosaka 05.03.2012 / 11:55

2 respostas

2

Observe a diretiva SSLRequire - a regra a seguir deve examinar o campo do emissor (isto é, o certificado de CA) do certificado apresentado, selecione o CN e combine-o com o nome do seu certificado de CA DE PRODUÇÃO.

SSLRequire %{SSL_CLIENT_I_DN_CN} == "PRODUCTION-CA"
    
por 05.03.2012 / 12:40
0

Eu queria autenticar clientes com certificados emitidos por sub-CAs de uma AC intermediária, ou seja, como segue:

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

Você pode usar a variável SSL_CLIENT_CERT_CHAIN_n para inspecionar a cadeia e, por exemplo, faça o seguinte:

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

ou até várias CAs intermediárias de primeiro nível:

Require expr %{SSL_CLIENT_CERT_CHAIN_1} in { file('".../intermediate.cert.pem"), file(".../intermediate2.cert.pem") }
    
por 30.01.2018 / 19:04