git clone发生gnutls_handshake() failed: Decryption has failed的解决方法

系统是ubuntu (kylin) 20.04,git版本2.25。

clone出错

git clone github上的仓库的时候,报如下错误,
fatal: 无法访问'https://github.com/xxx/yyy.git': gnutls_handshake() failed: Decryption has failed.
重复多次都是如此。

简单尝试

git clone失败大部分情况都是网络问题,尤其是用github的情况下。

首先尝试代理,http_proxy,https_proxy,git config http.proxy等等常用的都试了,甚至proxychains这种hack的方式也试了,结果都不行。瞬间自信没了。

这次情况不一样了。

google一下

遇事不决问google,google一下只有寥寥几个结果,够惨的。排名第一是csdn[2],askubuntu和stackoverflow有几个相关但不完全相同的结果。

最后得出的方法是重新编译git,默认的版本使用gnutls,在proxy环境下工作的不是很好。可以使用openssl替换,即使在较差的网络环境中也工作的很好。

没办法,就搞吧。

重新编译

重新编译又有两种方法,其一是使用大佬提供的脚本[1]。第二是使用apt里的源码,自己编译打包deb,我参考了[2][3]两个教程。大致方法是

  1. 开启source源,获取源码apt source git
  2. 安装编译环境,sudo apt-get build-dep git
  3. 修改debian/control 文件中的libcurl4-gnutls-dev为libcurl4-openssl-dev,增加版本号dch -i
  4. 编译!dpkg-buildpackage -rfakeroot -uc -b,经过漫长的编译,以及跑了一整套test,终于打包了几个deb出来。(还有几个错误,不管了)
  5. 安装打包出来的deb,dpkg -i git_xxx.deb

终于大功告成,git clone很慢但没报Decryption的错误,设置好proxy成功。最后一个步骤,apt-mark hold git,防止git自动更新掉。这样就可以了。

后记

具体错误原因没有深入研究,看上去会比较复杂。因此采取了一个workaround,记录于此,感谢所有原作者。

第一次更新

1.已验证在livecd(ubuntu kylin 20.04 pro)中的git仍然有这个bug。在银河麒麟v10 sp1 livecd中,安装的git也有这个bug。
2.台式机(intel处理器)虚拟机同样livecd的git却是正常的,因此怀疑是硬件问题。
3.gitee没有这个问题。
推测是硬件问题,甚至可能是CPU指令集的问题。tls底层使用了AES算法,在cpu中有相关指令集。gitee没有问题可能是它使用了tls 1.2,而github是tls 1.3。
暂时不做更多的尝试了。

第二次更新

规范了编译流程(增加版本号等)。

参考

  1. https://github.com/paul-nelson-baker/git-openssl-shellscript/blob/main/compile-git-with-openssl.sh
  2. 解决git gnutls_handshake失败,https://blog.csdn.net/dean_yanqing/article/details/30239405
  3. 报错:gnutls_handshake() failed: Decryption has failed,https://www.cxyzjd.com/article/weixin_38184741/105889453
原文地址:https://www.cnblogs.com/cocode/p/15619044.html