最近在服务器上跑代码,clone Github代码报错
GnuTLS recv error (-110): The TLS connection was non-properly terminated.
TLS握手
TLS(Transport Layer Security,传输层安全协议)握手是建立安全网络连接的关键步骤。在Git通过HTTPS协议与远程仓库通信时,TLS握手的主要目的是:验证服务器的身份,确保连接到的是合法的远程仓库;客户端和服务器协商生成会话密钥,用于后续的数据加密传输。
握手过程通常包括以下步骤:
- 客户端问候:客户端向服务器发送支持的TLS版本、加密算法等信息。
- 服务器问候:服务器选择一种加密算法,并返回自己的证书用于身份验证。
- 密钥交换:客户端和服务器根据选定的加密算法协商生成会话密钥。
- 完成握手:双方确认握手完成,开始使用会话密钥进行加密通信。
报错原因
当出现“gnutls_handshake() failed”错误时,说明在TLS握手过程中出现了问题,导致无法建立安全连接。以下是几种常见原因:
1.代理设置问题
如果之前设置了代理,但当前网络环境不需要代理,或者代理配置不正确,可能会干扰Git与远程仓库的直接通信,导致TLS握手失败。Git在尝试通过代理连接时,可能无法正确处理握手过程中的数据包,从而引发错误。
2. Git版本问题
旧版本的Git可能存在兼容性问题,导致与服务器的TLS握手出现异常。例如,某些版本的Git使用GnuTLS库进行加密传输,在特殊情况下(如使用了代理服务器)可能出现握手失败的问题。
3. SSL证书问题
本地SSL证书过期或不受信任,会导致服务器的SSL证书无法通过客户端的验证。这可能是由于证书颁发机构(CA)的证书未正确安装,或者证书本身存在问题。
解决
清除代理设置
清除Git的代理配置,使Git能够直接与远程仓库建立连接,避免代理设置导致的握手问题:
git config --global --unset https.https://github.com.proxy
git config --global --unset http.https://github.com.proxy
更新Git版本
更新Git到最新版本,以确保使用的是经过优化和修复的版本,避免因旧版本的兼容性问题导致握手失败。在Linux系统上,可以通过包管理器(如apt-get
)更新Git。
我清除代理之后就OK了。