如何强制 Git (2.5+) HTTP 传输更喜欢 SPNEGO 而不是基本身份验证?

2024-03-03

Summary:我正在使用 Git for Windows 2.5.1 通过 Kerbesized Git 服务器进行身份验证。当我使用表单中的 URL 时https://el2-gitlab.sa.c/kkm/GrammarTools.git,Git 甚至不尝试协商身份验证,并询问用户名和密码。强制 Git 使用 SPNEGO 的解决方法是在 URL 本身中提供空的用户名和密码 https://github.com/git-for-windows/git/wiki/FAQ#how-do-i-access-a-repository-hosted-on-a-microsoft-team-foundation-server-inside-a-windows-domain, as in https://:@el2-gitlab.sa.c/kkm/GrammarTools.git。在这种情况下,Git 很乐意使用现有的 Kerberos 票证进行身份验证。

我可以配置 Git 以在不调整远程 URL 的情况下尝试 SPNEGO 吗?

更多细节。我花了很长时间试图解决这个问题。首先我尝试过在 .gitconfig 中给出一个空用户名 http://git-scm.com/docs/gitcredentials,但无济于事:

[credential "https://el2-gitlab.sa.c"]
   username = ''

我一次也没有遇到过关于reverse问题,当 Git 在尝试协商失败后拒绝恢复到 Basic 时,但行为是确认在 2.3.1 中发生了变化 https://stackoverflow.com/a/28522956/1149924.

使用空用户名和密码响应提示并没有帮助,这与我在 SO 上找到的一些建议相反(但它们可能早于版本 2.3.1)。

最后,详细的 libcurl 输出(此处省略)表明 Git 确实尝试了基本身份验证并完全放弃了协商:

$ export GIT_CURL_VERBOSE=1
$ git clone https://el2-gitlab.sa.c/kkm/GrammarTools.git kerbtest
Cloning into 'kerbtest'...
* Couldn't find host el2-gitlab.sa.c in the _netrc file; using defaults
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
> GET /kkm/GrammarTools.git/info/refs?service=git-upload-pack HTTP/1.1
Host: el2-gitlab.sa.c
User-Agent: git/2.5.1.windows.1

< HTTP/1.1 401 Unauthorized
< Status: 401 Unauthorized
< Www-Authenticate: Basic realm=""
< Www-Authenticate: Negotiate
<
* Connection #0 to host el2-gitlab.sa.c left intact
Username for 'https://el2-gitlab.sa.c':

另外可能有趣的是,Git 客户端在使用票证进行响应之前,会第二次重试 401 上未经身份验证的请求:

$ git clone https://:@el2-gitlab.sa.c/kkm/GrammarTools.git kerbtest
Cloning into 'kerbtest'...
* Couldn't find host el2-gitlab.sa.c in the _netrc file; using defaults
> GET /kkm/GrammarTools.git/info/refs?service=git-upload-pack HTTP/1.1
Host: el2-gitlab.sa.c
User-Agent: git/2.5.1.windows.1

< HTTP/1.1 401 Unauthorized
< Status: 401 Unauthorized
< Www-Authenticate: Basic realm=""
< Www-Authenticate: Negotiate
* Connection #0 to host el2-gitlab.sa.c left intact
* Issue another request to this URL: 'https://:@el2-gitlab.sa.c/kkm/GrammarTools.git/info/refs?service=git-upload-pack'
* Couldn't find host el2-gitlab.sa.c in the _netrc file; using defaults
> GET /kkm/GrammarTools.git/info/refs?service=git-upload-pack HTTP/1.1
Host: el2-gitlab.sa.c
User-Agent: git/2.5.1.windows.1

< HTTP/1.1 401 Unauthorized
< Status: 401 Unauthorized
< Www-Authenticate: Basic realm=""
< Www-Authenticate: Negotiate
<
* Issue another request to this URL: 'https://:@el2-gitlab.sa.c/kkm/GrammarTools.git/info/refs?service=git-upload-pack'
* Couldn't find host el2-gitlab.sa.c in the _netrc file; using defaults
> GET /kkm/GrammarTools.git/info/refs?service=git-upload-pack HTTP/1.1
Host: el2-gitlab.sa.c
Authorization: Negotiate YIIGtg[ .... trimmed ... ]
User-Agent: git/2.5.1.windows.1

< HTTP/1.1 200 OK

git 2.8(2016 年 3 月)应该可以缓解这个问题强制输入空用户名和密码http认证期间:

See commit 121061f https://github.com/git/git/commit/121061f67fd47aed5b2f3a7deb82af15215636bd (15 Feb 2016) by brian m. carlson (bk2204) https://github.com/bk2204.
(Merged by Junio C Hamano -- gitster -- https://github.com/gitster in commit 65ba75b https://github.com/git/git/commit/65ba75ba7daae3298139f18cf866a23d01f4dd48, 24 Feb 2016)

http:添加选项以尝试无需用户名进行身份验证

使用 Kerberos 执行 GSS-Negotiate 身份验证不需要指定用户名或密码,因为该信息已经存在 包含在门票本身中。
然而,libcurl如果未提供用户名和密码,则拒绝执行身份验证。

添加一个选项,http.emptyAuth,这提供了libcurl使用空的用户名和密码以使其尝试进行身份验证。

The git config文档 https://github.com/git/git/blob/121061f67fd47aed5b2f3a7deb82af15215636bd/Documentation/config.txt#L1603-L1607会提到:

http.emptyAuth:

尝试进行身份验证而不需要用户名或密码。
这可用于尝试 GSS-Negotiate 身份验证,而无需在 URL 中指定用户名,如下所示libcurl通常需要用户名进行身份验证。


Git 2.10.2(2016 年 10 月)将改进这一点。

See commit 5275c30 https://github.com/git/git/commit/5275c3081c2b2c6166a2fc6b253a3acb20f8ae89 (04 Oct 2016) by David Turner (csusbdt) https://github.com/csusbdt.
(Merged by Junio C Hamano -- gitster -- https://github.com/gitster in commit c6400bf https://github.com/git/git/commit/c6400bf8d5437e7614c86e6b027761e11ed7a1be, 17 Oct 2016)

http: http.emptyauth应该允许空(不仅仅是 NULL)用户名

当将 Kerberos 身份验证与较新版本的 libcurl 结合使用时,CURLOPT_USERPWD必须设置为一个值,即使它是空值。 该值永远不会发送到服务器。
以前版本的 libcurl 不需要设置此变量。
一些用户表达空用户名/密码的一种方法是http://:@gitserver.example.com, which http.emptyauth旨在支持。
另一个等效的 URL 是http://@gitserver.example.com.
后者导致用户名长度为零,而不是NULL用户名,但是CURLOPT_USERPWD仍然需要设置(如果http.emptyauth已设置)。
这样做。


当服务器仅支持单一身份验证方法时,Git 2.13(2017 年第二季度)将减少通过 HTTP 的身份验证往返。

See commit 40a18fc https://github.com/git/git/commit/40a18fc77ca3ba1b018f0fbdcbdf4a6d237aadf3 (25 Feb 2017), and commit 840398f https://github.com/git/git/commit/840398feb85bc0943119c669cda266a876859818 (22 Feb 2017) by Jeff King (peff) https://github.com/peff.
Helped-by: Johannes Schindelin (dscho) https://github.com/dscho.
(Merged by Junio C Hamano -- gitster -- https://github.com/gitster in commit 92718f5 https://github.com/git/git/commit/92718f57c2e18e69bc7ae3ed18c7157c475e17a9, 10 Mar 2017)

http: 添加一个“auto“ 模式为http.emptyauth

这个变量(http.emptyauth)需要指定才能使某些类型的非基本身份验证起作用,但理想情况下这对于每个人来说都是开箱即用的。

然而,只需将其设置为“1" 默认情况下会引入额外的往返isn't有用。我们最终发送了服务器拒绝的伪造的空凭据。

“自动”模式应该使其开箱即用,而不会产生任何影响 对于访问仅限基本服务器的人来说,任何额外的往返行程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何强制 Git (2.5+) HTTP 传输更喜欢 SPNEGO 而不是基本身份验证? 的相关文章

  • 为什么 cmake 在 git commit 后编译所有内容

    假设我有时在 Linux 上使用 cmake 2 8 编译一段代码 我更改了一个文件 my changed file 运行 cmake 并且只构建了这个文件 到目前为止 一切都很好 现在我想提交这个 git add my changed f
  • 我应该如何将更改从一个提交转移到另一个提交?

    我在同一个分支上有两个提交 一个接一个 我在第一次提交中添加了对文件 A 的更改 然后对其他文件进行了一些更改 然后进行了另一次提交 现在我希望对文件 A 的更改是在第二次提交而不是第一次提交 最优雅的方式是什么 我知道这是一个老问题 但我
  • 在防火墙后面使用 GitHub,无需 SSH 访问

    我真的很想使用 GitHub 但我的公司一切都被锁定了 现在 我只能通过HTTP协议使用Tortoise SVN 我可以以同样的方式使用 GitHub 吗 如果是这样 怎么办 我认为你一直能够克隆github https github co
  • Eclipse git checkout(又名恢复)

    是否可以做相当于git checkout在 Eclipse 中使用 Egit 插件 我有一个已修改的文件 我想放弃更改并将文件恢复到源存储库中的内容 在 Subversion 中 这称为恢复 在 git 中 相当于 checkout 我在团
  • 自给定提交以来 git 中的作者列表

    我想要一种列出所有 git 作者的方法 仅自给定提交以来 是独特的 这两个很简单 我在网上看到过一些解决方案 大多数使用git log format 但我看到的都不符合附加要求 按提交日期排序 因此 如果约翰 史密斯 John Smith
  • 从“git diff”中排除文件

    我正在尝试排除一个文件 db irrelevant php 来自 Git diff 我尝试将文件放入db子目录名为 gitattributes与线irrelevant php diff我还尝试创建一个名为 git info attribut
  • 撤消多个文件和文件夹“git add”[重复]

    这个问题在这里已经有答案了 我执行了 git add 现在我想恢复 git add 我怎样才能做到这一点 git reset 这相当于git reset HEAD 将取消 add 更常见的是 取消暂存 所有文件 In Git revert用
  • 是否有 git-merge --dry-run 选项?

    我正在合并一个可能有很多冲突的远程分支 我怎么知道它是否会发生冲突 我没有看到任何类似的东西 dry run on git merge 如前所述 传入 no commit标志 但为了避免快进提交 也传入 no ff 像这样 git merg
  • 是否可以使用“最小”算法进行交互式添加?

    当从快照计算变更集时 Git 并不总是正确选择块边界 git diff has a diff algorithm允许在这方面进行一些调整的选项 git diff minimal有时会给出比git diff alone 有没有办法获得相同的优
  • 使用 Git 撤消临时更改

    假设我在 master 上并且有一个斑点 DEBUG FALSE CACHE SIZE 100 code code code 现在我开始在新分支中调试 DEBUG TRUE Don t forget to turn off CACHE SI
  • git svn 克隆特定分支并合并

    我希望将我的代码库从 svn 迁移到 git 我的 svn 仓库中有太多分支 我只想克隆几个分支并将它们合并在一起并将其推送到 git 我想避免克隆所有分支 因为这需要很长时间 我该如何实现这一目标 完成后 我想定期从这些 svn 分支获取
  • 使用 reposurgeon 将 svn repo 转换为 git

    我正在尝试使用 svn repo 转换为 git再生外科医生 http www catb org esr reposurgeon 这是我所做的 有一个具有 svn 名称 gt git 名称映射的 repo map 文件 svnadmin d
  • 如何对私有 jelastic 环境进行版本控制

    为了跟踪 Jelastic 托管环境的配置 我想在 git 存储库中对其进行版本控制 该存储库应该是私有的 并包含多个具有不同版本的不同分支 例如master abc123 v1 1 我的第一次尝试是创建一个私有 github 存储库 其中
  • Git在Windows中的克隆比在Linux中慢得多

    我一直在追寻 Windows 上 github 克隆速度极慢的问题 Linux kali 没有这个问题 我的下行连接速度为 100 40 megabit s 我可以获得接近 8mb s 的下载速度 没有问题 我已将电脑直接插入互联网插座 无
  • 无法在 github 上的特定分支上生成 git no such file or directory

    问题出在这个 fork repo 上 https github com RubenWillems CCNet https github com RubenWillems CCNet 我可以在同一台笔记本电脑上安装其他叉子 但不能使用此叉子
  • 为什么我无法在 Windows 10 中将 notepad++ 设置为 git 提交编辑器?

    我知道这个问题已经被不止一次地提出和回答过 但我尝试了答案所建议的至少十种不同的方法 但没有一个对我有用 我总是得到nano当我这样做时作为编辑 git commit 如果我可以剪切并粘贴到nano 但这是做不到的 举个例子 这是我的 gi
  • GitLab 是否通过 git-annex 或其他方式支持大文件?

    我运行一个 GitLab 实例 并希望允许我的用户上传几乎任何大小的文件 众所周知 git 在处理大文件方面仍然存在问题 我知道通过将文件存储在其他地方并仅对元数据进行版本控制来规避此问题的方法 例如git annex git media
  • 尝试编译 git 但在 linux 中找不到 libcurl

    我想编译支持 http https 的 git 我有 ls usr include curl curlbuild h curl h curlrules h curlver h easy h mprintf h multi h stdchea
  • 撤消 git pull,如何将存储库恢复到旧状态

    有什么方法可以恢复或撤消 git pull 以便我的源 存储库将恢复到执行 git pull 之前的旧状态 我想这样做是因为它合并了一些我不想这样做的文件 但只合并了其他剩余的文件 那么 我想找回这些文件 可以吗 编辑 我想撤消 git m
  • 压缩 git log --graph 输出?

    有没有办法压缩输出git log graph那么它会在视觉上压缩遵循线性历史的提交吗 基本上 我只想查看图中某些分支分歧 合并的点 以获得我的分支结构的顶层 概述 举个例子 如果我有这个 A Z H B G C F D E 我希望它显示类似

随机推荐