我正在使用git repo和git-http-backend。在apache2中我有位置需要身份验证克隆和推送操作。当我用AuthType Basic保护它的位置时 所有工作都很好,git通过身份验证,可以克隆和推送,但如果我将类型更改为KerberosV5 git无法使用正确的凭据访问repo。如果我正在使用我的浏览器,我可以访问位置以保护kerberos。
git clone http://user@mydomain.com/git/myapp.git
Initialized empty Git repository in /tmp/myapp/.git/
Password:
error: The requested URL returned error: 401 while accessing http://user@mydomain.com/git/myapp.git/info/refs
fatal: HTTP request failed
和apache错误日志
[Fri Aug 06 17:15:50 2010] [debug] src/mod_auth_kerb.c(1579): [client 192.168.12.153] kerb_authenticate_user entered with user (NULL) and auth_type KerberosV5
[Fri Aug 06 17:15:50 2010] [debug] src/mod_auth_kerb.c(1579): [client 192.168.12.153]kerb_authenticate_user entered with user (NULL) and auth_type KerberosV5
git-core 1:1.7.1-1~bpo50 + 1 apache2 2.2.9-10 + lenny8 libapache2-mod-auth-curb 5.3-5
答案 0 :(得分:3)
curl中的问题,因为debian中的git是使用curl选项
ANY_AUTH
编译的,当git客户端尝试连接到webserver并首先要求它协商auth并且它无法执行此操作时,git don&#39 ;尝试基本身份验证。
使用Git 2。3。1(2015年第1季度/第2季度)会更加强大:commit 4dbe664见brian m. carlson (bk2204
):
remote-curl
:如果Basic
失败,则回退到Negotiate
身份验证使用
mod_auth_kerb
的Apache服务器可以配置为允许用户 使用Negotiate(使用Kerberos票证)或进行身份验证 基本身份验证(使用Kerberos密码)。通常,一个人会 想要使用谈判认证(如果可用),但要退回 如果故障单丢失或过期,则进行基本身份验证。但是,
libcurl
会尽力使用Basic
之外的其他内容 auth,甚至通过HTTPS 如果提供了Basic
和其他内容,libcurl
将永远不会尝试使用Basic
,即使其他选项失败。 教授HTTP客户端代码以停止尝试其身份验证机制 在第一次失败后不要使用密码(目前为Negotiate
),因为如果他们第一次失败,他们将永远不会成功。
答案 1 :(得分:1)
curl中的问题,因为debian中的git是用curl选项ANY_AUTH编译的,当git客户端尝试连接到webserver并首先要求它协商auth并且它不能这样做时,git不要尝试基本的auth,因为基本比谈判安全性低。当我尝试curl --anya,我也可以'从网络服务器获取数据,但如果我改变--basic一切正常,问题就是我无法告诉git auth应该使用什么。
答案 2 :(得分:1)
这在libcurl中是奇怪的,而不是Git中的问题。有一个解决方法。如果您未将用户名和密码传递给库,则Libcurl不会启用任何身份验证代码。如果您使用不需要用户名和密码的negotiate(kerberos),也会发生这种情况。简单的解决方案:
echo http://x:x@git.example.com > ~/.git-credentials
git config --global credential.helper store
x:x是用户名和密码。你可以在那里使用任何随机字符串。只需要在libcurl中启用代码路径进行身份验证。然后kerberos将工作(为我工作:))。