来自 gitlab 的 Git 克隆在 Linux 上失败,而在 Windows git bash 中工作

Posted

技术标签:

【中文标题】来自 gitlab 的 Git 克隆在 Linux 上失败,而在 Windows git bash 中工作【英文标题】:Git clone from gitlab fails on linux, while working in Windows git bash 【发布时间】:2021-08-11 06:47:30 【问题描述】:

我是 Linux 新手,刚刚安装了 Lubuntu 并遇到了问题 - 当我试图从我公司的 git 克隆我的远程工作仓库时:

$ sudo git clone https://path/to/repo.git

我不断收到错误:

Cloning into 'repo'...
fatal: unable to access 'https://path/to/repo.git/': server certificate verification failed. CAfile: none CRLfile: none

我知道它提到了证书,但我没有任何证书。在此之前,我在 Windows 上工作,并且能够简单地 git clone 这个 repo 而无需任何证书。

【问题讨论】:

这能回答你的问题吗? server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none 旁注:在sudo 下运行git clone 几乎总是不好的。这使得整个 Git 存储库归超级用户所有。至多,一些从存储库中提取的文件应该归超级用户所有;充其量(但并非总是可能),任何文件都不应该归超级用户所有。 【参考方案1】:

此错误表示git客户端无法验证证书链或根的完整性。解决此问题的正确方法是确保来自远程存储库的证书有效,然后将其添加到客户端系统。

更新公共 CA 列表

我建议的第一件事是简单地更新系统已知的根 CA 列表,如下所示。

# update CA certificates
sudo apt-get install apt-transport-https ca-certificates -y
sudo update-ca-certificates

如果您正在处理一个长时间未更新的系统,这可能会有所帮助,但当然不会解决私有证书的问题。

获取证书,直接连接

如果您将来自远程 git 服务器的证书添加到本地检查的证书列表中,来自 git 客户端的错误将得到解决。这可以通过使用 openssl 从远程主机提取证书来完成:

openssl s_client -showcerts -servername git.mycompany.com -connect git.mycompany.com:443 </dev/null 2>/dev/null | sed -n -e '/BEGIN\ CERTIFICATE/,/END\ CERTIFICATE/ p'  > git-mycompany-com.pem

这将获取“https://git.mycompany.com”使用的证书,并将内容复制到名为“git-mycompany-com.pem”的本地文件中。

获取证书、网络代理

如果此主机只能通过 Squid 等 Web 代理访问 git 服务器,则仅当您使用的是 OpenSSL 1.1.0 及更高版本时,openssl 才能利用 squid 代理。但是,如果您使用的是旧版本的 OpenSSL,则需要通过使用诸如 socat 之类的东西在本地绑定到端口 4443,并通过 squid 代理流量并到达最终目的地来解决此限制。

# install socat
sudo apt-get install socat -y

# listen locally on 4443, send traffic through squid "squidhost"
socat TCP4-LISTEN:4443,reuseaddr,fork PROXY:squidhost:git.mycompany.com:443,proxyport=3128

然后在另一个控制台中,告诉 OpenSSL 从 localhost 的 4443 端口拉取证书。

openssl s_client -showcerts -servername git.mycompany.com -connect 127.0.0.1:4443 </dev/null 2>/dev/null | sed -n -e '/BEGIN\ CERTIFICATE/,/END\ CERTIFICATE/ p' > git-mycompany-com.pem

将证书添加到本地证书列表

无论是通过代理还是直接连接,您现在都可以在名为“git-mycompany-com.pem”的文件中获得远程证书列表。此文件将包含证书、其中间链和根 CA 证书。 下一步是让 git 客户端在连接到 git 服务器时考虑这一点。这可以通过将证书添加到原始错误中提到的文件来完成,在这种情况下,对所有用户进行全局更改,或者可以将其添加到单个用户的 git 配置中。

** 全局添加 **

cat git-mycompany-com.pem | sudo tee -a /etc/ssl/certs/ca-certificates.crt

** 为单用户添加 **

git config --global http."https://git.mycompany.com/".sslCAInfo ~/git-mycompany-com.pem

在 ~/.gitconfig 中默默地添加以下几行

[http "https://git.mycompany.com/"]
        sslCAInfo = /home/user/git-mycompany-com.pem

避免变通方法

避免跳过 SSL 认证验证的解决方法。仅使用它们来快速测试证书是否是根本问题,然后使用上面的部分来解决问题。

git config --global http.sslverify false

export GIT_SSL_NO_VERIFY=true

【讨论】:

没有冒犯,但除非您的 git 服务器托管在本地并且您知道它是安全的,这是一个糟糕的想法(和建议)。 谢谢@tink 的建议。我完全同意你的看法。我已经相应地更新了答案。如果你觉得有用,请点赞:) 很好的答案!

以上是关于来自 gitlab 的 Git 克隆在 Linux 上失败,而在 Windows git bash 中工作的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 GitLab 克隆 git 存储库

gitlab怎么克隆最新版本

Git如何克隆Gitlab?Git本地仓库如何上传Gitlab?

通过 Nginx 代理为 Gitlab 服务器克隆的 Git 不起作用

在 GitLab 中使用 SSH 进行 Git 克隆不起作用

win10下git与gitlab安装与文件上传