Autenticar com certificado SSL do cliente OU autenticação básica

Autenticar com certificado SSL do cliente OU autenticação básica

Por motivos de segurança, a autenticação de uma aplicação web deve ser migrada para certificados de cliente SSL. Deve ser possível fazer login com nome de usuário/senha ou SSL. Além disso, os usuários da intranet devem ter permissão para usar o Aplicativo sem autenticação adicional.

Tentamos implementar este cenário conforme a documentação oficial, mas sem sucesso.

Aqui está nossa configuração atual

<Directory /opt/app/system/html>
    RedirectMatch permanent ^/$ /exec/login.pl
    Options -Indexes +FollowSymLinks
    SSLVerifyClient optional
    SSLVerifyDepth  2
    SSLRequire      %{SSL_CLIENT_I_DN_O} eq "Company_O"
    SSLOptions      +FakeBasicAuth

    Satisfy     any

    AuthType Basic
    AuthName "Zugriffsschutz"
    AuthBasicProvider file
    AuthUserFile /etc/apache2/htaccess/iapp.passwd
    require valid-user

    Order allow,deny
    Allow from 10.20.0.0/255.255.0.0
    Allow from 10.144.100
</Directory>

Com esta configuração, um certificado de cliente nem sequer é solicitado. Se removermos a configuração básica de autenticação, a autenticação do cliente SSL funcionará bem.

Responder1

A pergunta tem três meses, então minha resposta pode não ser necessária para o OP, mas pode ajudar quem deseja essa configuração.

A pergunta está marcada como apache-2.4, mas a configuração parece apropriada para 2.2. Isso não é totalmente surpreendente, já que muitos exemplos na documentação do Apache 2.4 parecem não ser apropriados para o 2.4.

Eu tinha essa configuração funcionando no 2.2 (exceto "Permitir de" que não funcionou) e tive que reescrevê-la para o 2.4. Descobri que eram necessários alguns elementos que não eram imediatamente aparentes na documentação.

Não ofereço nenhuma garantia para isso; é baseado no meu arquivo de configuração sem testes. +StrictRequirepode não ser necessário SSLOptions- não tentei sem ele, mas funciona dessa maneira.

Aliás, a SSLOptionslinha pode não ser necessária - a +FakeBasicAuthopção provavelmente não está sendo usada. Na configuração que tenho aqui, assim que Company_Ofor encontrado no certificado o acesso será concedido. Pelo que entendi, +FakeBasicAuthé usado com Require valid-user(sozinho) e o acesso é concedido se o DN do certificado for encontrado na lista de usuários definida em AuthUserFile, junto com uma senha apropriada. Meu sistema não funciona assim e suspeito que o OP também não queria fazer isso.

<Directory /opt/app/system/html>
    RedirectMatch permanent ^/$ /exec/login.pl
    Options -Indexes +FollowSymLinks

    # Anything which matches a Require rule will let us in

    # Make server ask for client certificate, but not insist on it
    SSLVerifyClient optional
    SSLVerifyDepth  2
    SSLOptions      +FakeBasicAuth +StrictRequire

    # Client with appropriate client certificate is OK
    <RequireAll>
        Require ssl-verify-client
        # Correction: eq is integer comparison, string comparison requires ==
        # Require expr %{SSL_CLIENT_I_DN_O} eq "Company_O"
        Require expr %{SSL_CLIENT_I_DN_O} == "Company_O"
    </RequireAll>

    # Set up basic (username/password) authentication
    AuthType Basic
    AuthName "Zugriffsschutz"
    AuthBasicProvider file
    AuthUserFile /etc/apache2/htaccess/iapp.passwd

    # User which is acceptable to basic authentication is OK
    Require valid-user

    # Access from these addresses is OK
    Require ip 10.20.0.0/255.255.0.0
    Require ip 10.144.100
</Directory>

eu tenho

<Directory />
    ...
    Require all denied
    ...
</Directory>

em um arquivo de configuração diferente - pode ser que essa seja uma parte importante da receita.

O que demorei para fazer isso funcionar foi que parecia que a Require expr %{SSL_CLIENTbroca funcionaria sozinha, mas eventualmente percebi que isso Require ssl-verify-clienttambém era necessário (vejahttp://httpd.apache.org/docs/2.4/mod/mod_ssl.html#authzproviders)

Responder2

Achei a resposta do @yitzchok-lavi muito útil, mas se (como eu) você quiser evitar o pop-up de autenticação básica que aparece para clientes fora da sua rede e sem certificado de cliente, a Require valid-userdiretiva precisa estar dentro da RequireAllseção. Além disso, a questão do OP sugere que isso já estava presente em algum lugar de sua configuração, mas para completar, se alguém se deparar com esta questão, também a SSLCACertificateFilediretiva é necessária (para definir quais certificados de cliente CA serão verificados).

O snippet de configuração que uso:

<Directory /opt/app/system/html>
    RedirectMatch permanent ^/$ /exec/login.pl
    Options -Indexes +FollowSymLinks

    # Anything which matches a Require rule will let us in

    # Make server ask for client certificate, but not insist on it
    SSLVerifyClient optional
    SSLVerifyDepth  2
    SSLOptions      +FakeBasicAuth +StrictRequire
    # client certs will be verified against this CA
    SSLCACertificateFile /etc/apache2/ssl/iapp-ca.pem

    # Client with appropriate client certificate is OK
    <RequireAll>
        Require ssl-verify-client
        Require expr %{SSL_CLIENT_I_DN_O} == "Company_O"
        # User which is acceptable to basic authentication is OK
        Require valid-user
    </RequireAll>

    # Set up basic (username/password) authentication
    AuthType Basic
    AuthName "Zugriffsschutz"
    AuthBasicProvider file
    AuthUserFile /etc/apache2/htaccess/iapp.passwd

    # Access from these addresses is OK
    Require ip 10.20.0.0/255.255.0.0
    Require ip 10.144.100
</Directory>

informação relacionada