解决git gnutls_handshake失败

本文解决git无法clone时遇到的gnutls握手失败问题,通过编译git使用openssl替代gnutls包来修复,适用于代理环境。提供了详细步骤和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://askubuntu.com/questions/186847/error-gnutls-handshake-falied-when-connecting-to-https-servers


解决git 无法clone的问题,错误提示如下

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


Got reason of the problem, it was gnutls package. It's working weird behind a proxy. But openssl is working fine even in weak network. So workaround is that we should compile git with openssl. To do this, run the following commands:

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

Then, edit debian/control file (run the command: gksu gedit debian/control) and replace all instances of libcurl4-gnutls-dev with libcurl4-openssl-dev

sudo dpkg-buildpackage -rfakeroot -b

(if it's failing on test, you can remove the line TEST=test from the file debian/rules)

sudo dpkg -i ../git_1.7.9.5-1_i386.deb

Inspired from here http://code.google.com/p/wfuzz/wiki/PyCurlSSLBug


### 解决方案 当遇到 `gnutls_handshake()` 出现的 `Error in the pull function` 时,通常是因为网络连接问题或者 SSL/TLS 配置不兼容引起的。以下是几种可能的解决方案: #### 方法一:禁用 HTTPS 的 SSL 验证 可以通过设置 Git 不验证 SSL 来绕过此错误。这种方法适用于临时解决问题的情况。 ```bash git config --global http.sslVerify false ``` 需要注意的是,关闭 SSL 验证可能会带来安全风险,因此仅建议在受信任的环境中使用[^1]。 #### 方法二:切换到 HTTP 协议 如果 HTTPS 连接存在问题,可以尝试将远程仓库地址从 HTTPS 切换为 HTTP(如果有提供)。例如: ```bash git remote set-url origin http://github.com/username/repository.git ``` 这种方式避免了 TLS 握手过程中的潜在问题[^2]。 #### 方法三:更新或替换加密库 有时该问题是由于 GnuTLS 库版本较旧或存在 bug 导致的。可以考虑升级 GnuTLS 或者让 Git 使用 OpenSSL 替代 GnuTLS。具体操作如下: - **安装或启用 OpenSSL 支持** 如果操作系统支持 OpenSSL,则可以让 Git 使用它来替代 GnuTLS。例如,在某些 Linux 发行版中,Git 可能默认使用 GnuTLS;通过重新编译或更换包管理器中的依赖项可以选择 OpenSSL。 - **强制指定协议栈** 对于 Windows 用户,可以直接下载最新版本的 Git 客户端并确保其配置文件启用了最新的 TLS 版本。运行以下命令以确认当前使用的 TLS 设置: ```bash git -c http.postBuffer=524288000 clone https://github.com/username/repo.git ``` #### 方法四:调整代理设置 即使已经尝试重置代理,仍需进一步检查是否存在隐式的代理干扰通信链路。执行以下指令清除所有已定义的代理变量: ```bash git config --global --unset http.proxy git config --global --unset https.proxy ``` 随后再次测试克隆功能是否恢复正常。 --- ### 总结 上述四种方式分别针对不同层面的原因提供了修复途径——从简单的全局参数修改到深入探讨底层依赖关系及其相互作用机制。实际应用过程中可根据具体情况逐一排查直至找到最合适的解决办法。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值