错误:gnutls_handshake() 失败的 GIT 存储库

Posted

技术标签:

【中文标题】错误:gnutls_handshake() 失败的 GIT 存储库【英文标题】:error: gnutls_handshake() failed GIT repository 【发布时间】:2012-11-11 12:47:22 【问题描述】:

当我尝试克隆 git 存储库时出现以下错误。我也正确配置了 rsa 公钥。

$ git clone https://github.com/blah/blah.git
Initialized empty Git repository in /home/arun/.git/
error: gnutls_handshake() failed: A TLS packet with unexpected length was
       received. while accessing https://github.com/blah/blah.git/info/refs

fatal: HTTP request failed

【问题讨论】:

【参考方案1】:

它可以用于GnuTLs or pycurl bug

以下是pycurl_7.19.0-4ubuntu3的新方法:

sudo apt-get install build-essential fakeroot dpkg-dev
mkdir ~/python-pycurl-openssl
cd ~/python-pycurl-openssl
sudo apt-get source python-pycurl
sudo apt-get build-dep python-pycurl
sudo apt-get install libcurl4-openssl-dev
sudo dpkg-source -x pycurl_7.19.0-4ubuntu3.dsc
cd pycurl-7.19.0
# remove the HAVE_CURL_GNUTLS=1 in the following file
sudo vim debian/patches/10_setup.py.dpatch
# remove the HAVE_CURL_GNUTLS=1 in the following file
sudo vim setup.py
# replace all gnutls into openssl in the following file
sudo vim debian/control
sudo dpkg-buildpackage -rfakeroot -b
sudo dpkg -i ../python-pycurl_7.19.0-4ubuntu3_amd64.deb

【讨论】:

感谢分享。在最后一步中,我收到以下错误。你有什么线索吗? $ sudo dpkg -i ../python-pycurl_7.19.0-4ubuntu3_amd64.deb dpkg: 错误处理 ../python-pycurl_7.19.0-4ubuntu3_amd64.deb (--install): 无法访问存档: 没有这样的文件或目录 错误是处理时遇到:../python-pycurl_7.19.0-4ubuntu3_amd64.deb @user1514027 我想这取决于上一步构建的确切 .deb 文件名(dpkg-buildpackage)。您需要查看并搜索生成的实际名称。 我遵循了这个解决方案,偏差包括源文件显示为 pycurl_7.19.0-3.dsc 而不是 pycurl_7.19.0-4ubuntu3.dsc。我还发现有必要不要编辑补丁文件,这样做会导致构建时出现 MD5 失败。 最后,行为没有改变,也许我需要找到一种方法来真正阻止该宏被定义。也许我可以手动更改 setup.py 并停止应用补丁? 编辑了已修补的 setup.py 以删除宏定义,然后删除了已修补的文件并删除了 /debian/patches/00list 中的引用。构建似乎可以工作,但行为仍然没有变化。当。我的证书失败会导致类似的问题吗?【参考方案2】:

我遇到了这个问题,我花了一段时间才找到解决方案。我一直在想我在某个地方遗漏了一个包裹。我不想重新编译 Git,因为我已经在使用最新版本,而且我很确定问题不在于 Git 本身。

我的问题是我的.gitconfig 文件。该问题仅发生在多年来已多次升级的旧 Linux 服务器上。在某些时候,出于某种我不记得的原因,我在 .gitconfig 文件中明确指定了 sslVersion = sslv3

当我看到这一点时,灯泡亮了,因为我知道 SSL V3 出于安全考虑已被弃用,并且大多数人应该改用 TLS。例如,参见 RFC 7568,https://www.rfc-editor.org/rfc/rfc7568

所以我的修复涉及从我的~/.gitconfig 文件中删除有问题的sslVersion = sslv3 行,或者更改此:

[httpd] 
    sslVersion = sslv3

到这里:

[httpd]
    sslVersion = tlsv1.2

删除这条线并让 Git/libcurl 协商加密似乎是最好的选择,因为 TLS v1.3 正在开发中,我不想以后再遇到这个问题!

【讨论】:

好建议。有许多 git-config options 可能会导致此类问题,或者可以用作解决方法。【参考方案3】:

在我的情况下,我似乎没有使用 pycurl,所以上述解决方案对我不起作用。所做的工作是重建 git-core 修改为使用 openssl 而不是 gnutls。

说明在这里:

https://askubuntu.com/questions/186847/error-gnutls-handshake-falied

我在大多数地方都用“git-core”代替了“git”,.dsc(包信息文件?)出现为 git-core_1.7.0.4-1ubuntu0.2.dsc,而 .deb 包以 git-core_1.7.0.4-1ubuntu0.2_i386.deb 出现。

【讨论】:

【参考方案4】:

在我自己的用户没有足够权限的目录中尝试sudo git fetch 时,我遇到了同样的问题。我将存储库移至 /tmp 并继续我的工作。

别忘了/tmp 在重启后会被删除。

【讨论】:

仅在某些系统上【参考方案5】:

在我的情况下,混合@Rick 和@m0j0 的解决方案

首先执行这些命令:

git config --global http.sslVerify false
git config --global http.sslVerify true

添加或修改后~/.gitconfig

nano ~/.gitconfig

设置这个:

[httpd] 
    sslVersion = sslv3

【讨论】:

【参考方案6】:

对我来说,最终证明 SSL 证书是自签名的。试试这个

git config --global http.sslVerify false

【讨论】:

永远不要这样做。它会禁用git 曾经建立的每个 TLS 连接的身份验证,从而消除对多种攻击的保护。

以上是关于错误:gnutls_handshake() 失败的 GIT 存储库的主要内容,如果未能解决你的问题,请参考以下文章

解决 git 同步错误 gnutls_handshake() failed

解决 git 同步错误 gnutls_handshake() failed

解决 git 同步错误 gnutls_handshake() failed

解决 git 同步错误 gnutls_handshake() failed

解决 git 同步错误 gnutls_handshake() failed

gnutls_handshake() failed: A TLS fatal alert has been received