我们希望将我们的开发服务器上的访问权限限制为拥有有效的SSL客户端证书的用户。 我们在Debian 6上运行Apache 2.2.16。
但是,对于某些部分(主要是git-http,在https://my.server/git/上使用gitolite进行设置),我们需要一个例外,因为许多git客户端不支持SSL客户端证书。
我已经成功地为服务器要求客户端证书authentication,并为某些位置添加了例外情况。 但是,似乎这不适合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>
我也尝试了一种替代解决scheme,结果相同:
# require authentication everywhere except /git and /foo <LocationMatch "^/(?!git|foo)"> SSLVerifyClient require SSLVerifyDepth 2 </LocationMatch>
在这两种情况下,没有客户端证书的用户可以完全访问my.server / foo /,但不能访问my.server / git /(由于没有给出有效的客户端证书,访问被拒绝)。 如果我完全禁用SSL客户端证书authentication,my.server / git /可以正常工作。
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 /
我的testing脚本只是简单地打印出环境,非常简单:
#!/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 ,任何SSLVerifyClient指令正在应用在位置块匹配/testing/ someLocation 或只是/ someLocation 。
如果我有以下configuration:
<LocationMatch "^/f"> SSLVerifyClient require SSLVerifyDepth 2 </LocationMatch>
然后,以下URL需要客户端证书: https://my.server/test/foo 。 但是,以下URL不会: https://my.server/test/somethingElse/foo
请注意,这似乎只适用于SSLconfiguration。 以下对https://my.server/test/foo没有任何影响:
<LocationMatch "^/f"> Order allow,deny Deny from all </LocationMatch>
但是,它阻止访问https://my.server/foo 。
这对于我在https://my.server/project (必须要求SSL客户端证书授权)中运行一些项目的情况提出了一个主要问题, 并且在https:// my上有该项目的git存储库。 server / git / project不能要求SSL客户端证书。 由于/ git /项目的URL也得到匹配agains /项目Location块,这样的configuration似乎是不可能的,根据我目前的发现。
问题 :为什么发生这种情况,我该如何解决我的问题?
最后,我想要为整个服务器(除/ git和/ someLocation之外)提供SSL客户端证书授权,尽可能less的configuration(所以我不必每次部署新东西时都要修改configuration, git仓库被添加)。
更新更多信息:请注意,在某些情况下, https://my.server/project实际上是反向代理,因此<Directory /path/to/project>指令是不可能的。 如果我想用SSL客户端证书保护该应用程序,则必须使用<Location /project> (或更一般的<Location /> )块。
更新2我刚刚在apache 2.4.3中testing了这个结果。 如果这是由于一些错误,至less目前在两个版本。
注意:我重写了我的问题(而不是在底部添加更多更新),以考虑到我的新发现,并希望更清楚地说明。
根据目前的Apache文档,这可能是一个问题:
在每服务器上下文中,它适用于在build立连接时在标准SSL握手中使用的客户端身份validation过程。 在每个目录上下文中,在HTTP请求被读取之后但在发送HTTP响应之前,它强制使用重新configuration的客户端validation级别的SSL重新协商。
如何使用<Directory>上下文而不是<Location>。 一个用于根目录的条目,另一个用于Script-Aliaspath:/ path / to / gitolite-shell /
更新:
我发现这种情况下的一些build议 – > 在Stackoverflow的问题/答案