系統是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