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