Git 协议选择:HTTPS 与 SSH 的优缺点及配置

Git 支持 HTTPS 与 SSH 两种远程仓库协议,选择哪种取决于你的使用场景。本文从认证机制、安全性、易用性等维度对比,并给出具体配置方法,帮助你快速决策。

Git 协议选择:HTTPS 与 SSH 的优缺点及配置
封面图:ZuCDN · ZuCDN 原创

在 Git 版本控制中,选择 HTTPS 还是 SSH 作为远程仓库的传输协议,直接影响你的日常操作效率与安全性。本文从 Git 协议选择的判断路径开始,详细展开两者的优缺点和配置方法,帮助你根据自身场景做出正确选择。

判断路径:先回答三个问题

在纠结协议之前,先问自己三个问题:

  • 使用频率:你是否每天多次推送代码?频繁操作时,SSH 的免密登录优势更明显。
  • 网络环境:你的网络是否可能限制 SSH 端口(22)?某些公司防火墙会屏蔽该端口,此时 HTTPS 更稳妥。
  • 团队协作:团队是否使用 HTTPS 并配置了凭据缓存?统一协议可降低协作成本。

如果追求便捷且网络无障碍,推荐 SSH;如果环境受限或需要临时访问,HTTPS 更通用。下面展开分析。

HTTPS 与 SSH 的核心差异

HTTPS 和 SSH 都是 Git 支持的传输协议,但它们在认证方式、安全模型和使用体验上有本质区别。

HTTPS:基于用户名与密码或令牌

HTTPS(Hypertext Transfer Protocol Secure)是 HTTP 的安全版本,它在 HTTP 基础上通过 TLS 加密传输数据。根据 RFC 9110,HTTP 是应用层协议,而 HTTPS 在传输层提供加密。Git 使用 HTTPS 时,通常需要输入用户名和密码(或访问令牌)进行认证。

  • 优点
    • 端口 443 通常不会被防火墙屏蔽,兼容性极佳。
    • 无需额外生成密钥对,只需账号密码即可克隆公开仓库。
    • 适合临时或一次性操作,例如在 CI/CD 环境中使用。
  • 缺点
    • 每次推送都需要输入凭据,除非配置缓存(如 Git 凭据管理器),但缓存有效期有限。
    • 密码或令牌可能被泄露,需要定期更换。

SSH:基于密钥对认证

SSH(Secure Shell)是一种加密网络协议,常用于安全远程登录。Git 使用 SSH 时,通过公钥认证,无需每次输入密码。

  • 优点
    • 配置完成后无需输入密码,体验流畅。
    • 密钥对比密码更难被暴力破解,安全性更高。
    • 适合长期、高频的推送操作。
  • 缺点
    • 默认端口 22 可能被防火墙屏蔽,需要额外配置。
    • 首次配置密钥对有一定学习成本。

安全性对比:不仅仅是加密

两者都通过加密保护传输数据,但安全侧重点不同。

  • HTTPS:依赖 TLS 证书验证服务器身份,防止中间人攻击。但用户认证依赖密码或令牌,若密码泄露则账户风险高。
  • SSH:使用公钥加密,私钥保存在本地,无需在网络传输密码。但私钥本身需要妥善保管,若泄露则攻击者可完全控制你的 Git 操作。

根据 MDN 的 HTTP 指南,HTTP 是无状态协议,HTTPS 继承了这一特性,但通过 TLS 增加了安全性。而 SSH 是独立协议,其认证机制与 HTTP 完全不同。

配置 HTTPS:从克隆到推送

使用 HTTPS 克隆仓库非常简单:

git clone https://github.com/user/repo.git

首次推送时,Git 会提示输入用户名和密码。为避免重复输入,可以启用凭据缓存:

git config --global credential.helper cache

上述命令会缓存凭据 15 分钟(默认)。也可以使用更持久的存储:

git config --global credential.helper store

但 store 模式会明文保存凭据,需谨慎使用。更推荐使用 Git 官方凭据管理器(如 Git Credential Manager),它支持多因素认证和令牌刷新。

配置 SSH:从生成密钥到连接

SSH 配置分为三步:生成密钥、添加公钥到远程仓库、测试连接。

  1. 生成密钥对:
    ssh-keygen -t ed25519 -C "your_email@example.com"

    一路回车即可,默认保存在 ~/.ssh/id_ed25519。

  2. 添加公钥到远程仓库(如 GitHub、GitLab),复制 ~/.ssh/id_ed25519.pub 内容。
  3. 测试连接:
    ssh -T git@github.com

    首次连接会提示确认主机指纹,输入 yes 即可。

之后克隆时使用 SSH 地址:

git clone git@github.com:user/repo.git

如果 SSH 端口被屏蔽,可以尝试使用 443 端口(部分服务支持),但需额外配置。

常见误区与失败条件

  • 误区一:SSH 一定比 HTTPS 安全。实际上,如果私钥泄露,SSH 风险更大;而 HTTPS 的令牌可以单独撤销。
  • 误区二:HTTPS 无法用于自动化。其实可以通过令牌或 SSH 密钥在 CI 中使用 HTTPS,只是需要额外配置。
  • 失败条件
    • HTTPS 推送时密码错误或令牌过期,导致认证失败。
    • SSH 连接时,如果主机密钥变更,Git 会拒绝连接,需要手动更新 known_hosts。

如何切换已有仓库的协议

如果当前仓库使用 HTTPS,想切换到 SSH,只需修改远程 URL:

git remote set-url origin git@github.com:user/repo.git

反之亦然。切换后无需重新克隆,但需确保新协议的认证已配置好。

参考资料

延伸阅读