zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    扩展DigitalClock显示日期+时间
    利用Handler定时更新Android UI
    CheckBox在表格中全选、部分选和反选
    jQuery实现表格间隔色
    Android中对话框(dialog)的使用
    The connection to adb is down, and a severe error has occured.
    struts2类型转化
    Android开发之旅:环境搭建及HelloWorld
    C/C++浮点数在内存中的存储方式
    用标签写登录界面
  • 原文地址:https://www.cnblogs.com/cocode/p/15619044.html
Copyright © 2011-2022 走看看