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]两个教程。大致方法是
- 开启source源,获取源码
apt source git
- 安装编译环境,
sudo apt-get build-dep git
- 修改debian/control 文件中的libcurl4-gnutls-dev为libcurl4-openssl-dev,增加版本号
dch -i
- 编译!
dpkg-buildpackage -rfakeroot -uc -b
,经过漫长的编译,以及跑了一整套test,终于打包了几个deb出来。(还有几个错误,不管了) - 安装打包出来的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。
暂时不做更多的尝试了。
第二次更新
规范了编译流程(增加版本号等)。
参考
- https://github.com/paul-nelson-baker/git-openssl-shellscript/blob/main/compile-git-with-openssl.sh
- 解决git gnutls_handshake失败,https://blog.csdn.net/dean_yanqing/article/details/30239405
- 报错:gnutls_handshake() failed: Decryption has failed,https://www.cxyzjd.com/article/weixin_38184741/105889453