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

vet*_*122 3 linux git ubuntu git-clone gitlab

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

$ sudo git clone https://path/to/repo.git
Run Code Online (Sandbox Code Playgroud)

我不断收到错误:

Cloning into 'repo'...
fatal: unable to access 'https://path/to/repo.git/': server certificate verification failed. CAfile: none CRLfile: none
Run Code Online (Sandbox Code Playgroud)

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

Pra*_*Raj 12

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

\n

更新公共 CA 列表

\n

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

\n
# update CA certificates\nsudo apt-get install apt-transport-https ca-certificates -y\nsudo update-ca-certificates\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

获取证书,直接连接

\n

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

\n
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\n
Run Code Online (Sandbox Code Playgroud)\n

这将获取 \xe2\x80\x9chttps://git.mycompany.com\xe2\x80\x9d 使用的证书,并将内容复制到名为 \xe2\x80\x9cgit-mycompany-com.pem\ 的本地文件中xe2\x80\x9d。

\n

获取证书、Web 代理

\n

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

\n
# install socat\nsudo apt-get install socat -y\n\n# listen locally on 4443, send traffic through squid "squidhost"\nsocat TCP4-LISTEN:4443,reuseaddr,fork PROXY:squidhost:git.mycompany.com:443,proxyport=3128\n
Run Code Online (Sandbox Code Playgroud)\n

然后在另一个控制台中,告诉 OpenSSL 从端口 4443 处的本地主机提取证书。

\n
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\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n

** 全局添加 **

\n
cat git-mycompany-com.pem | sudo tee -a /etc/ssl/certs/ca-certificates.crt\n
Run Code Online (Sandbox Code Playgroud)\n

** 为单用户添加 **

\n
git config --global http."https://git.mycompany.com/".sslCAInfo ~/git-mycompany-com.pem\n
Run Code Online (Sandbox Code Playgroud)\n

它将以下行默默添加到 ~/.gitconfig

\n
[http "https://git.mycompany.com/"]\n        sslCAInfo = /home/user/git-mycompany-com.pem\n
Run Code Online (Sandbox Code Playgroud)\n

避免变通办法

\n

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

\n
git config --global http.sslverify false\n\nexport GIT_SSL_NO_VERIFY=true\n
Run Code Online (Sandbox Code Playgroud)\n