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

23

当我尝试克隆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
6个回答

8

这可能与GnuTLs或pycurl的错误有关。

以下是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 - Arun Jayapal
1
@user1514027 我想这取决于之前步骤(dpkg-buildpackage)构建的确切.deb文件名。您需要查看并搜索实际生成的名称。 - VonC
1
最终,行为没有改变,也许我需要找到一种真正阻止宏定义的方法。也许我可以手动更改setup.py并停止应用补丁? - 2NinerRomeo
编辑修补后的setup.py文件以删除宏定义,然后删除修补后的文件并在/debian/patches/00list中删除引用。编译似乎成功了,但行为仍然没有改变。我的证书失败是否会导致类似的问题? - 2NinerRomeo
@2NinerRomeo,我没有找到有关该线程的任何新信息,所以我会对你的发现感兴趣。 - VonC
显示剩余3条评论

7
我曾经遇到过这个问题,花了一段时间才找到解决方案。我一直认为自己在某个地方缺少了一个软件包。由于我已经使用最新版本的 Git,并且相信问题不是出在 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正在开发中,我不想在将来再次遇到此问题!


1
好的建议。有许多 git-config 选项 可能会导致此类问题,或者可以用作解决方法。 - 7yl4r

5
在我的情况下,似乎我没有使用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。


1

当我尝试在一个没有足够权限的目录中使用sudo git fetch时,遇到了同样的问题。我将仓库移动到/tmp并继续我的工作。

不要忘记/tmp在重新启动后会被清除。


仅在某些系统上。 - Georgi-it

-2
在我的情况下,混合@Rick和@m0j0的解决方案起作用了。
首先执行这些命令:
git config --global http.sslVerify false
git config --global http.sslVerify true

在添加或修改~/.gitconfig

nano ~/.gitconfig

设置这个:

[httpd] 
    sslVersion = sslv3

-3
对我来说,问题最终是SSL证书是自签名的。你可以尝试以下解决方法:
在命令行中输入以下命令: git config --global http.sslVerify false

6
千万不要这样做。这会禁用 git 所有已建立的 TLS 连接的身份验证,从而消除保护措施,使其容易受到多种攻击。请务必注意。 - cjs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接