git連接到https服務器時出現“gnutls_handshake() failed”


git連接到https服務器時出現“錯誤: gnutls_handshake()失敗”

問題描述

當我嘗試使用git連接到任何HTTPS服務器時(例如git clone),它會出現以下錯誤:

$ git clone https://github.com/xx/x.git
Cloning into 'xx'...
fatal: unable to access 'https://github.com/xx/xx.git/': gnutls_handshake() failed: The TLS connection was non-properly terminated.

之前使用搜索到一些文章,說是代理問題,取消即可:

# 如果沒有配置代理,可使用以下命令 取消代理 :
git config --global --unset http.proxy
git config --global --unset https.proxy

可是問題仍然存在。

error: gnutls_handshake() failed: A TLS packet with unexpected length was received. while accessing ...
fatal: HTTP request failed

我認為可能有些與gnutls_handshake相關的軟件包已被破壞;開始懷疑SSL有關的部分。

參考資料:

傻瓜化解決方法

關閉SSL自簽名,不需要額外的改動:

git config --global http.sslVerify false

附錄:通過重裝git解決

得到問題的原因,gnutls包出現問題可能會導致連接異常,它在代理背后很奇怪。

但是openssl即使在弱網絡中也能正常工作。所以解決方法是我們應該用openssl編譯git

為此,請運行以下命令:

$ sudo apt-get update
$ sudo apt-get install build-essential fakeroot dpkg-dev
$ sudo apt-get build-dep git
$ mkdir ~/git-openssl
$ cd ~/git-openssl
$ apt-get source git
$ dpkg-source -x git_1.7.9.5-1.dsc
$ cd git-1.7.9.5

請記住將1.7.9.5替換為系統中實際的git版本。

然后,編輯debian/control文件(運行命令:gksu gedit debian/control)並將所有libcurl4-gnutls-dev實例替換為libcurl4-openssl-dev

然后構建軟件包(如果測試失敗,可以從文件debian/rules中刪除TEST=test行):

sudo apt-get install libcurl4-openssl-dev
sudo dpkg-buildpackage -rfakeroot -b

安裝新包:

  • i386:sudo dpkg -i ../git_1.7.9.5-1_i386.deb
  • x86_64:sudo dpkg -i ../git_1.7.9.5-1_amd64.deb

靈感來自:https://github.com/xmendez/wfuzz/wiki/PyCurlSSLBug


免責聲明!

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



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