Desejamos restringir o acesso em nosso servidor de desenvolvimento aos usuários que possuem um certificado válido de cliente SSL. Estamos executando o Apache 2.2.16 no Debian 6.
No entanto, para algumas seções (principalmente git-http, configuração com gitolite no link ), precisamos de uma exceção, pois muitos clientes git don suporte a certificados de cliente SSL.
Consegui exigir a autenticação do certificado de cliente para o servidor e adicionar exceções para alguns locais. No entanto, parece que isso não funciona para o git.
A configuração atual é a seguinte:
SSLCACertificateFile ssl-certs/client-ca-certs.crt
<Location />
SSLVerifyClient require
SSLVerifyDepth 2
</Location>
# this works
<Location /foo>
SSLVerifyClient none
</Location>
# this does not
<Location /git>
SSLVerifyClient none
</Location>
Eu também tentei uma solução alternativa, com os mesmos resultados:
# require authentication everywhere except /git and /foo
<LocationMatch "^/(?!git|foo)">
SSLVerifyClient require
SSLVerifyDepth 2
</LocationMatch>
Em ambos os casos, um usuário sem certificado de cliente pode acessar perfeitamente my.server / foo /, mas não my.server / git / (o acesso é recusado porque nenhum certificado de cliente válido é fornecido). Se eu desabilitar completamente a autenticação do certificado de cliente SSL, o my.server / git / funciona ok.
O problema do ScriptAlias
Gitolite é configurado usando a diretiva ScriptAlias. Eu descobri que o problema ocorre com qualquer ScriptAlias similar:
# Gitolite
ScriptAlias /git/ /path/to/gitolite-shell/
ScriptAlias /gitmob/ /path/to/gitolite-shell/
# My test
ScriptAlias /test/ /path/to/test/script/
Note que / path / to / test / script é um arquivo, não um diretório, o mesmo vale para / path / to / gitolite-shell /
Meu script de teste simplesmente imprime o ambiente, super simples:
#!/usr/bin/perl
print "Content-type:text/plain\n\n";
print "TEST\n";
@keys = sort(keys %ENV);
foreach (@keys) {
print "$_ => $ENV{$_}\n";
}
Parece que, se eu vou para link , que qualquer diretiva SSLVerifyClient está sendo aplicada e que estão em blocos de local que correspondem a / teste / algumaLocalização ou apenas / algumaLocalização .
Se eu tiver a seguinte configuração:
<LocationMatch "^/f">
SSLVerifyClient require
SSLVerifyDepth 2
</LocationMatch>
Em seguida, o URL a seguir requer um certificado de cliente: link . No entanto, o seguinte URL não: link
Observe que isso parece se aplicar apenas à configuração SSL. O seguinte não tem efeito algum no link :
<LocationMatch "^/f">
Order allow,deny
Deny from all
</LocationMatch>
No entanto, ele bloqueia o acesso ao link .
Isso representa um grande problema para os casos em que tenho algum projeto em execução no link (que precisa exigir a autorização do certificado de cliente SSL) < strong> e existe um repositório git para esse projeto no link que não pode exigir um certificado de cliente SSL. Como a URL / git / project também é correspondida novamente / project Location
blocks, essa configuração parece impossível, dadas as minhas descobertas atuais.
Pergunta : Por que isso está acontecendo e como resolvo meu problema?
No final, desejo exigir a autorização do certificado SSL Client para todo o servidor, exceto para / git e / someLocation, com configuração mínima possível (para que não precise modificar a configuração sempre que algo novo for implementado ou um novo repositório git é adicionado).
Atualizar Mais informações: Observe que, em alguns casos, o link é, na verdade, reverso do proxy para que <Directory /path/to/project>
directiva é impossível. Se eu quiser proteger esse aplicativo com um certificado de cliente SSL, isso deve necessariamente ser com um bloco <Location /project>
(ou mais geral <Location />
).
Update 2 Acabei de testar isso no apache 2.4.3, com o mesmo resultado. Se isso foi devido a algum bug, pelo menos está presente em duas versões.
Observação: reescrevi minha pergunta (em vez de apenas adicionar mais atualizações na parte inferior) para levar em conta minhas novas descobertas e, com sorte, deixar isso mais claro.