우리는 개발 서버에 대한 액세스를 유효한 SSL 클라이언트 인증서가 있는 사용자로 제한하고 싶습니다. 우리는 Debian 6에서 Apache 2.2.16을 실행하고 있습니다.
그러나 일부 섹션(주로 git-http, gitolite를 사용하여 설정)https://my.server/git/) 많은 git 클라이언트가 SSL 클라이언트 인증서를 지원하지 않으므로 예외가 필요합니다.
서버에 대한 클라이언트 인증서 인증을 요구하고 일부 위치에 대한 예외를 추가하는 데 성공했습니다. 그러나 이것은 git에서는 작동하지 않는 것 같습니다.
현재 설정은 다음과 같습니다.
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>
나는 또한 동일한 결과를 가진 대체 솔루션을 시도했습니다.
# require authentication everywhere except /git and /foo
<LocationMatch "^/(?!git|foo)">
SSLVerifyClient require
SSLVerifyDepth 2
</LocationMatch>
두 경우 모두 클라이언트 인증서가 없는 사용자는 my.server/foo/에 완벽하게 액세스할 수 있지만 my.server/git/에는 액세스할 수 없습니다(유효한 클라이언트 인증서가 제공되지 않아 액세스가 거부됨). SSL 클라이언트 인증서 인증을 완전히 비활성화하면 my.server/git/이 정상적으로 작동합니다.
ScriptAlias 문제
Gitolite는 ScriptAlias 지시문을 사용하여 설정됩니다. 유사한 ScriptAlias에서 문제가 발생하는 것으로 나타났습니다.
# Gitolite
ScriptAlias /git/ /path/to/gitolite-shell/
ScriptAlias /gitmob/ /path/to/gitolite-shell/
# My test
ScriptAlias /test/ /path/to/test/script/
/path/to/test/script는 디렉토리가 아닌 파일입니다. /path/to/gitolite-shell/도 마찬가지입니다.
내 테스트 스크립트는 매우 간단하게 환경을 인쇄합니다.
#!/usr/bin/perl
print "Content-type:text/plain\n\n";
print "TEST\n";
@keys = sort(keys %ENV);
foreach (@keys) {
print "$_ => $ENV{$_}\n";
}
내가 가면 그럴 것 같다.https://my.server/test/someLocation, /test/someLocation과 일치하는 Location 블록에 있는 모든 SSLVerifyClient 지시문이 적용되고 있음을 나타냅니다.아니면 그냥 /someLocation.
다음 구성이 있는 경우:
<LocationMatch "^/f">
SSLVerifyClient require
SSLVerifyDepth 2
</LocationMatch>
그런 다음 다음 URL에는 클라이언트 인증서가 필요합니다.https://my.server/test/foo. 그러나 다음 URL은 그렇지 않습니다.https://my.server/test/somethingElse/foo
이는 SSL 구성에만 적용되는 것 같습니다. 다음은 아무런 영향을 미치지 않습니다.https://my.server/test/foo:
<LocationMatch "^/f">
Order allow,deny
Deny from all
</LocationMatch>
그러나 다음 항목에 대한 액세스를 차단합니다.https://my.server/foo.
이는 일부 프로젝트가 실행 중인 경우에 큰 문제를 야기합니다.https://my.server/project(SSL 클라이언트 인증서 인증이 필요함)그리고해당 프로젝트에 대한 git 저장소가 있습니다.https://my.server/git/projectSSL 클라이언트 인증서가 필요할 수 없습니다. /git/project URL도 /project 블록과 일치하므로 Location
현재 조사 결과에 따르면 이러한 구성은 불가능해 보입니다.
질문: 왜 이런 일이 발생하며, 문제를 해결하려면 어떻게 해야 합니까?
결국 가능한 최소한의 구성으로 /git 및 /someLocation을 제외한 전체 서버에 대해 SSL 클라이언트 인증서 인증을 요구하고 싶습니다. git 저장소가 추가되었습니다).
업데이트추가 정보: 어떤 경우에는https://my.server/project실제로 역방향 프록시가 적용되어 <Directory /path/to/project>
지시문이 불가능합니다. SSL 클라이언트 인증서로 해당 애플리케이션을 보호하려면 반드시 <Location /project>
(또는 보다 일반적인 <Location />
) 블록을 사용해야 합니다.
업데이트 2방금 Apache 2.4.3에서 이것을 테스트했는데 동일한 결과가 나왔습니다. 이것이 버그로 인한 것이라면 적어도 두 가지 버전이 있습니다.
참고: 나는 새로운 발견을 고려하고 이를 더 명확하게 하기 위해 (맨 아래에 더 많은 업데이트를 추가하는 대신) 내 질문을 다시 작성했습니다.
답변1
현재에 따르면아파치 문서이것은 문제가 될 수 있습니다:
서버별 컨텍스트에서는 연결이 설정될 때 표준 SSL 핸드셰이크에 사용되는 클라이언트 인증 프로세스에 적용됩니다. 디렉터리별 컨텍스트에서는 HTTP 요청을 읽은 후 HTTP 응답이 전송되기 전에 재구성된 클라이언트 확인 수준으로 SSL 재협상을 강제합니다.
<Location> 대신 <Directory> 컨텍스트를 사용하는 것은 어떻습니까? 루트 수준에 대한 항목 하나와 Script-Alias 경로에 대한 항목: /path/to/gitolite-shell/
업데이트:
이 사건에 대한 몇 가지 조언을 찾았습니다 ->Stackoverflow의 질문/답변