
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. +StrictRequire
pode não ser necessário SSLOptions
- não tentei sem ele, mas funciona dessa maneira.
Aliás, a SSLOptions
linha pode não ser necessária - a +FakeBasicAuth
opção 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 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_CLIENT
broca funcionaria sozinha, mas eventualmente percebi que isso Require ssl-verify-client
també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-user
diretiva precisa estar dentro da RequireAll
seçã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 SSLCACertificateFile
diretiva é 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>