Docker化Git服务器Apache HTTP/HTTPS基础认证失效求助
Git服务器HTTP认证失效问题修复
问题现象
使用提供的Dockerfile构建集成Apache与SSH的Git服务器容器后,访问http://localhost:8080/git/test.git时未弹出基础认证窗口,无需输入账号密码即可执行git clone操作克隆仓库,配置的Basic认证完全失效。
核心原因
- 认证规则作用范围错误:当前Apache配置将认证规则放在
/var/www/git的<Directory>块中,但Git HTTP请求是通过ScriptAlias映射到/usr/lib/git-core/git-http-backend/处理,而该目录的规则是Require all granted,直接绕过了认证。 - 全局匿名读取开关开启:配置中的
SetEnv GIT_HTTP_EXPORT_ALL会让Git允许所有仓库的匿名读取访问,直接跳过认证检查。
修复步骤
1. 修改Apache虚拟主机配置
替换Dockerfile中生成/etc/apache2/sites-available/000-default.conf的echo内容,将认证规则移至<Location>块(针对Git请求路径),并移除GIT_HTTP_EXPORT_ALL环境变量:
<VirtualHost *:80> SetEnv GIT_PROJECT_ROOT /var/www/git ScriptAlias /git/ /usr/lib/git-core/git-http-backend/ <Location /git/> AuthType Basic AuthName "Git Access" AuthUserFile /auth/.htpasswd Require valid-user Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch SetEnv GIT_HTTP_BACKEND "/usr/lib/git-core/git-http-backend" </Location> <Directory "/usr/lib/git-core"> Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Require all granted </Directory> </VirtualHost> <VirtualHost *:443> SSLEngine on SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key SetEnv GIT_PROJECT_ROOT /var/www/git ScriptAlias /git/ /usr/lib/git-core/git-http-backend/ <Location /git/> AuthType Basic AuthName "Git Access" AuthUserFile /auth/.htpasswd Require valid-user Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch SetEnv GIT_HTTP_BACKEND "/usr/lib/git-core/git-http-backend" </Location> <Directory "/usr/lib/git-core"> Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Require all granted </Directory> </VirtualHost>
2. 可选:细化仓库权限(区分读写)
如果需要允许匿名只读、认证可写,可保留GIT_HTTP_EXPORT_ALL,但在<Location>块中针对推送请求增加认证:
<Location /git/> AuthType Basic AuthName "Git Access" AuthUserFile /auth/.htpasswd # 匿名允许读取,推送需要认证 <LimitExcept GET HEAD OPTIONS> Require valid-user </LimitExcept> Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch SetEnv GIT_HTTP_BACKEND "/usr/lib/git-core/git-http-backend" </Location>
同时在Dockerfile中添加命令开启仓库推送权限:
RUN git config --file /var/www/git/test.git/config http.receivepack true
3. 重新构建并启动容器
docker build -t git-server . docker run -d -p 8080:80 -p 2222:22 -p 8443:443 git-server
验证效果
执行clone命令,此时会提示输入账号密码:
git clone http://localhost:8080/git/test.git
输入root/root即可完成克隆;若输入错误密码则会被拒绝访问。
内容的提问来源于stack exchange,提问作者linkedlist
相关产品推荐
相关产品推荐

