Possível ter diferentes SSLCACertificateFiles sob diferentes locais no Apache (certificados ssl do lado do cliente)

5

Estou configurando o Apache para fazer autenticação de cartão inteligente. O login do cartão inteligente é baseado em certificados SSL do lado do cliente manipulados por um driver do sistema operacional.

Atualmente, tenho apenas um provedor de cartão inteligente, mas, no futuro, há vários deles. Não tenho certeza de como o Apache 2.2. lida com certificações do lado do cliente por Localização. Fiz alguns testes rápidos e de alguma forma parecia que apenas a última diretiva SSLCACertificateFile teria sido eficaz e isso não soa bem.

É possível ter diferentes SSLCACertificateFile por Local no Apache (2.2, 2.4) como descrito abaixo ou o protocolo SSL de alguma forma está limitando que você não pode ter mais de um SSLCACertificateFile por IP?

Exemplo de configuração potencial abaixo como eu gostaria de lidar com vários SSLCACertificateFile no mesmo servidor para permitir que os usuários façam login com diferentes tipos de cartões inteligentes.

<VirtualHost 127.0.0.1:443>

    # Real men use mod_proxy
    DocumentRoot "/nowhere"

    ServerName local-apache
    ServerAdmin [email protected]

    SSLEngine on
    SSLOptions +StdEnvVars +ExportCertData

    # Server-side HTTPS configuration
    SSLCertificateFile /etc/apache2/certificate-test/server.crt
    SSLCertificateKeyFile /etc/apache2/certificate-test/server.key

    # Normal SSL site traffic does not require verify client
    SSLVerifyClient none
    SSLVerifyDepth 999

    # Provider 1
    <Location /@@smartcard-login>
        SSLVerifyClient require

        SSLCACertificateFile /etc/apache2/certificate-test/ca.crt

        # Apache does not natively pass forward headers
        # created by SSLOptions +StdEnvVars,
        # so we pass them forward to Python using RequestHeader
        # from mod_headers
        RequestHeader set X-Client-DN %{SSL_CLIENT_S_DN}e
        RequestHeader set X-Client-Verify %{SSL_CLIENT_VERIFY}e
    </Location>

    # Provider 2
    <Location /@@smartcard-login-provider-2>
        # For real
        SSLVerifyClient require

        SSLCACertificateFile /etc/apache2/certificate-test/provider2.crt

        # Apache does not natively pass forward headers
        # created by SSLOptions +StdEnvVars,
        # so we pass them forward to Python using RequestHeader
        # from mod_headers
        RequestHeader set X-Client-DN %{SSL_CLIENT_S_DN}e
        RequestHeader set X-Client-Verify %{SSL_CLIENT_VERIFY}e
    </Location>


    # Connect to Plone ZEO client1 running on fg
    ProxyPass             / http://localhost:8080/VirtualHostBase/https/local-apache:443/folder_sits/sitsngta/VirtualHostRoot/
    ProxyPassReverse      / http://localhost:8080/VirtualHostBase/https/local-apache:443/folder_sits/sitsngta/VirtualHostRoot/

</VirtualHost>
    
por Mikko Ohtamaa 15.09.2012 / 22:58

2 respostas

3

Como foi respondido pelo Vlastimil Zima, você pode usar SSLRequire para isso (pelo menos se você quiser / precisar fazer a diferença entre os dois CA's). Caso contrário, apenas combinar os dois certificados em um é bom o suficiente (como perguntado por Curtis: sim, você pode simplesmente combinar certificados para fazer algo parecido com este trabalho). E vendo o seu exemplo, apenas combinando é bom o suficiente.

Com o SSLRequire você pode verificar o emissor (supondo que os CNs sejam diferentes), por exemplo:

<Location /locationone>
SSLRequire %{SSL_CLIENT_I_DN_CN} == "THE CN OF THE FIRST ISSUER"
</location>

<Location /locationtwo>
SSLRequire %{SSL_CLIENT_I_DN_CN} == "THE CN OF THE SECOND ISSUER"
</location>

E para que isso funcione, você ainda precisa combinar os 2 Certificados de CA em um.

    
por 04.07.2013 / 16:21
1

A diretiva SSLCACertificateFile tem contexto de host virtual, portanto, isso afetará o Host Virtual inteiro mesmo quando inserido em Location . Você precisa usar SSLRequire para verificar se o cliente usa o certificado correto para o local.

link

    
por 25.04.2013 / 10:47