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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM