【问题标题】:git push to https repository from Intranet application with kerberos authentication使用 kerberos 身份验证从 Intranet 应用程序 git 推送到 https 存储库
【发布时间】:2023-03-15 04:55:01
【问题描述】:

首先,总的来说,我对 https、ssl 和身份验证还很陌生。

我开发了一个 Intranet 应用程序,它应该从本地 git 存储库(托管在 Web 服务器上)和远程存储库(托管在 Unix 服务器上)实现一些“推送”。

Web 服务器是安装了 IIS 的 Windows 2003 服务器。我还在这台机器上安装了 Windows git 扩展。远程 git URL 如下所示:“https://username@server.domain.fr/team_folder/project.git”。

在 Web 服务器上,当我想从 git bash 向远程存储库推送某些内容时,会显示一个 openSSH 弹出窗口并询问我的 Windows 密码。如果我输入正确的密码,就会执行推送。这是由“askpass”配置引起的。

core.askpass = C:/Program Files (x86)/Git/libexec/git-core/git-gui--askpass

如果我删除此配置的参数,git 会在命令窗口中提示输入密码。正常...

我的问题:我们使用kerberos进行身份验证,那么是否可以在不向用户询问密码的情况下实现推送操作?如何 ?。我尝试配置腻子,但目前没有成功(就像我写的那样,我不是身份验证专家)。

现在我使用我为不询问密码而修改的 git-credential-winstore(在 IIS 服务器端不可用)。当 git 要求 GCW 获取密码时,它只是返回一个空密码。所以 git 以返回码 0 结束,我的应用程序要求用户输入密码,调用 GCW 来存储它并再次调用 git 来执行命令。它有效,但我很确定这不是最好的解决方案。

【问题讨论】:

  • git 2.8 应该可以使用git config http.emptyAuth true。见my answer below

标签: git authentication passwords kerberos


【解决方案1】:

虽然,这显然不是主题,但我还是会回答(Unix 服务器,任何客户端):

  1. 安装mod_spnego
  2. 配置mod_spnego
  3. 在 Windows 上安装 Git,确保提供的 libcurl 已针对 SSPI (--with-sspi) 进行编译
  4. 在 Unix 上安装 Git,确保链接的 libcurl 已针对 GSS-API (--with-gssapi) 进行编译

libcurl 从 Git 调用的方式,ANYAUTH 选择默认用户名+密码 (:)。而已。 libcurl 应该做剩下的事情。

在这里可以通过受 SPNEGO 保护的代理来对抗外部存储库。

【讨论】:

  • 感谢您的回答,但为什么这里“明显偏离主题”?我最近在网站上发帖,可能我不知道所有规则,所以我想知道。
  • 我没有能力修改我们的Unix环境,所以我认为你的回答对我不起作用。我只能修改Windows服务器端。
  • @P.Debrabant,Windows 服务器是用作 HTTP 服务器还是仅用作客户端?
  • 我的网络 Intranet 应用程序托管的 windows 服务器因此是针对 Unix 服务器的客户端。
【解决方案2】:

我们使用kerberos进行身份验证,那么是否可以在不向用户询问密码的情况下实现推送操作?

是的,从 git 2.8+(2016 年 3 月)开始

怎么做?

git config http.emptyAuth true

这将在 http 身份验证期间强制用户名和密码为空

参见brian m. carlson (bk2204)commit 121061f(2016 年 2 月 15 日)。
(由 Junio C Hamano -- gitster -- 合并于 commit 65ba75b,2016 年 2 月 24 日)

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

使用 Kerberos 执行 GSS-Negotiate 身份验证不需要指定用户名或密码,因为该信息已经 包含在门票中。
但是,libcurl 在没有提供用户名和密码的情况下拒绝执行身份验证。

添加一个选项http.emptyAuth,它为libcurl 提供一个空的用户名和密码,以使其无论如何都尝试进行身份验证。

git config documentation 将显示为:

http.emptyAuth:

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

注意:支持http://:@gitserver.example.com,并且从 Git 2.11+(2016 年第四季度)开始,它还支持http://@gitserver.example.com,如果设置了http.emptyauth,则强制使用 NULL 用户名。

参见 David Turner (csusbdt)commit 5275c30(2016 年 10 月 4 日)。
(由 Junio C Hamano -- gitster -- 合并到 commit c6400bf,2016 年 10 月 17 日)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 2010-09-09
    • 2021-08-30
    • 2011-06-07
    • 1970-01-01
    • 2019-05-28
    • 2011-07-13
    相关资源
    最近更新 更多