Git LFS 和 HTTP 客户端身份验证

Git LFS and HTTP client authentication

我有一个私人 gitlab 实例,在尝试通过 https 访问它时需要客户端身份验证。因此,仅当您在 Web 浏览器中安装客户端证书时,转到 myserver.com 才有效。这对于常规使用来说不是问题,因为我只通过 SSH 使用 git。

但是,git LFS 似乎只支持 HTTPS。因此,当我在一个使用 LFS 的项目中尝试 git push 到我的服务器时,它将尝试仅使用 HTTPS 上传,显然会失败。

git push gitlab mybranch
fatal: unable to access 'https://git.myserver.com/coolguy/my-software.git/': gnutls_handshake() failed: Handshake failed

这是我的遥控器的样子:

git remote -v
gitlab  git@git.myserver.com:coolguy/my-software (fetch)
gitlab  git@git.myserver.com:coolguy/my-software (push)

除了修改 git 历史和创建一个没有 LFS 的新存储库(或重新配置我的服务器,使用 VPN 等)之外,在这种情况下我还能做些什么吗? git/lfs 是否支持 HTTPS 身份验证的客户端证书?我目前在我的本地机器上遇到了一个私人分支,我无法在任何地方 git push

编辑:忽略以下内容,它原来是一个错误的 apache 配置文件,与 git 和 gitlab

无关 我收到一个似乎与客户端身份验证无关的奇怪错误,可能是 LFS 错误:
git push gitlab mybranch
Remote "gitlab" does not support the LFS locking API. Consider disabling it with:
  $ git config lfs.https://git.myserver.com/coolguy/my-software.git/info/lfs.locksverify false
batch response: Post https://git.myserver.comcoolguy/my-software.git/info/lfs/objects/batch: dial tcp: lookup git.myserver.comcoolguy: no such host             
batch response: Post https://git.myserver.comcoolguy/my-software.git/info/lfs/objects/batch: dial tcp: lookup git.myserver.comcoolguy: no such host
batch response: Post https://git.myserver.comcoolguy/my-software.git/info/lfs/objects/batch: dial tcp: lookup git.myserver.comcoolguy: no such host
batch response: Post https://git.myserver.comcoolguy/my-software.git/info/lfs/objects/batch: dial tcp: lookup git.myserver.comcoolguy: no such host
batch response: Post https://git.myserver.comcoolguy/my-software.git/info/lfs/objects/batch: dial tcp: lookup git.myserver.comcoolguy: no such host
batch response: Post https://git.myserver.comcoolguy/my-software.git/info/lfs/objects/batch: dial tcp: lookup git.myserver.comcoolguy: no such host

注意它是如何将 URL 屠宰为 git.myserver.comcoolguy 而不是 git.myserver.com/coolguygit.myserver.com:coolguy

谢谢

Git LFS 最近在 3.0 中添加了对纯 SSH 协议的支持。但是,目前 none 的主要伪造者都支持它,因此您实际上仅限于通过 SSH 进行身份验证,然后通过 HTTPS 进行操作。

当您使用这种方法时,远程 URL 来自服务器通过 SSH。你可以从这个稍微修改过的例子中看出这一点:

$ ssh git@github.com git-lfs-authenticate octocat/knife-sppon.git download
{
  "href": "https://lfs.github.com/octocat/knife-spoon",
  "header": {
    "Authorization": "RemoteAuth SECRET"
  },
  "expires_at": "2021-10-15T01:34:57Z",
  "expires_in": 599
}

如果那里的 URL 不正确,那么它可能是您的 URL 问题的原因。请注意,您可以通过在推送 运行 之前设置 GIT_TRACE=1 来查看通过 SSH 的确切调用,这将向您显示 Git LFS 正在调用什么。

Git LFS 确实支持 HTTPS 证书,就像 Git 一样。选项 http.sslCerthttp.sslKey 控制证书和密钥,您可以使用 http.sslCAInfo 指定 CA。这些也可以在每个 URL 或每个 URL 模式的基础上设置;有关详细信息,请参阅 git config --help

请注意,对于 Git LFS,密钥和证书需要采用 PKCS#1 格式;你不能使用 PKCS#8 或 PKCS#12 格式,因为 Git LFS 使用的 Go TLS 库无法以 Git LFS 需要的所有方式处理这些格式。