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

4

Por motivos de segurança, a autenticação de um aplicativo da Web deve ser migrada para certificados de cliente SSL. Deve ser possível fazer o login com um 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 esse cenário de acordo com 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 essa configuração, um certificado de cliente nem é solicitado. Se removermos a configuração de autenticação básica, a autenticação do cliente SSL funcionará bem.

    
por Thomas Berger 03.03.2015 / 13:05

1 resposta

7

A pergunta tem três meses, então minha resposta pode não ser necessária pelo OP, mas pode ajudar qualquer pessoa que queira essa configuração.

A questão é marcada como apache-2.4, mas a configuração é semelhante à 2.2. Isso não é totalmente surpreendente, pois muitos exemplos na documentação do Apache 2.4 parecem não ser apropriados para o 2.4.

Eu tinha essa configuração trabalhando em 2.2 (exceto pelo "Allow from" que não funcionava) e tive que reescrevê-lo para 2.4. Eu descobri que precisava de alguns elementos que não estavam imediatamente aparentes na documentação.

Eu não ofereço garantia para isso; é baseado no meu arquivo de configuração sem teste. +StrictRequire pode não ser necessário em SSLOptions - Eu não tentei sem isso, mas funciona dessa maneira.

Para essa questão, a linha SSLOptions pode não ser necessária - a opção +FakeBasicAuth provavelmente não está sendo usada. Na configuração que tenho aqui, assim que Company_O for 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 dessa maneira 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
        Require expr %{SSL_CLIENT_I_DN_O} eq "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 me levou um tempo para conseguir esse trabalho foi que parecia que o Require expr %{SSL_CLIENT iria funcionar sozinho, mas eventualmente eu percebi que Require ssl-verify-client também era necessário (veja link )

    
por 01.06.2015 / 21:00