使用 Git 从 HTTPS 切换至 SSH

使用 Git 从 HTTPS 切换至 SSH

起因是我在 Linux 中使用 git push 推送经常卡住或失败,真的很烦,于是选择 切换成 SSH ,可以提高稳定性和体验,比较适合在 Linux 系统开发环境中长期使用。当然本文的方法也同样适用于 Windows。


1. 确认是否已生成 SSH 密钥对

先检查是否已有 .ssh/id_rsa 文件:

1
ls ~/.ssh

如果看到了 id_rsaid_rsa.pub 就说明已经有了密钥对。如果没有,就执行下面的命令生成:

1
ssh-keygen -t rsa -b 4096 -C "你的邮箱"

一路回车即可生成(个人使用,建议不设密码短语,会方便些)。


2. 将 SSH 公钥添加到远程仓库平台(如 GitHub / Gitee)

1. 复制公钥内容

1
cat ~/.ssh/id_rsa.pub

复制输出的整段文本(以 ssh-rsa 开头,以邮箱结尾)。对应 Windows 实际路径为 C:\Users\你的用户名\.ssh\

2. 添加到远程平台

1. GitHub:

  • 登录 GitHub。
  • 点击头像 → SettingsSSH and GPG keys
  • New SSH key,粘贴公钥,命名为“centos 7.6”等,命名自定义就好。

2. Gitee:

  • 登录 Gitee。
  • 用户头像 → 设置SSH公钥
  • 粘贴进去即可。

3. 切换仓库的远程地址从 HTTPS ➜ SSH

切换命令如下(在项目根目录下执行):

1
2
3
git remote -v                          # 查看当前远程仓库地址
git remote set-url origin git@github.com:yourname/yourrepo.git # 这个在 github/gitee 对应仓库 → 代码/克隆/下载 → SSH,点击复制
git remote -v # 再次查看,确保已修改成功

4. 测试 SSH 是否连接成功

1
ssh -T git@github.com

第一次会提示:

1
2
The authenticity of host 'github.com (IP)' can't be established...
Are you sure you want to continue connecting (yes/no)?

输入 yes 后,如果成功,会看到:

1
Hi yourname! You've successfully authenticated, but GitHub does not provide shell access.

这里可能存在一个 warning,大概意思是说 shell 中不能使用,不用管,这就已经配置好了!

5. 配置完成,一键三连!


6. 解决 GitHub SSH 连接被屏蔽:配置 443 端口

没错,又是我,经过 SSH 一段长期稳定后,它又又又又出问题了,于是就诞生了下面的内容(此方法仅适用于 GitHub,Gitee 等平台需不同配置):

22 端口(默认的 SSH 方式)

  1. 优点
  • 是 GitHub 官方最原生的 SSH 接口,最直接,少一层“伪装”。
  • 如果网络环境宽松(家里宽带、海外服务器),几乎是最快最稳的。
  1. 缺点
  • 很多公司 / 校园 / 国内云服务器,会屏蔽 22 端口(因为它是典型的 SSH 管理端口,容易被滥用)。
  • 一旦被封,直接 Connection timed out,完全没法用。

443 端口(备用 SSH 方式)

  1. 优点
  • 443 是 HTTPS 的标准端口,几乎任何网络都必须放行(否则连网页都上不了)。
  • GitHub 把 SSH 流量伪装成走 443,看起来像 HTTPS,因此能穿透大部分防火墙和限制。
  • 对于国内网络环境(尤其是云主机 / 校园网 / 公共 WiFi),稳定性往往比 22 更好。
  1. 缺点
  • 在极少数情况下,某些 DPI(深度包检测)会识别“这不是 HTTPS 流量”然后丢弃,但这种情况比较罕见。
  • 多了一层转发,理论上延迟可能略高,但对推送/拉取代码来说几乎无感。

总结:

  • 22 端口:原生 SSH,速度可能更快,但容易被封。👉 如果在家宽带上,22 可能稳定;但一旦换环境(比如公司 VPN、云主机),22 就可能挂掉。
  • 443 端口:稳定性最高,几乎所有网络环境都可用。👉 从长期和通用性来看,SSH 走 443 更稳定,因为 443 基本不会被封。443 和 22 性能差异极小,日常使用无感。

在国内或公司网络环境下,Git SSH 默认 22 端口有时会被屏蔽,导致推送失败(Connection timed out)。解决办法是切换到 GitHub 提供的备用入口: 443 端口 SSH。下面介绍操作步骤。

1. 查看当前远程仓库地址

1
git remote -v

输出类似:

1
2
origin  git@github.com:用户名/仓库名.git (fetch)
origin git@github.com:用户名/仓库名.git (push)

默认都是 22 端口的 SSH。

2. 切换到 SSH 443 端口

1
git remote set-url origin ssh://git@ssh.github.com:443/用户名/仓库名.git

注意:ssh.github.com + :443 是 GitHub 提供的备用端口,/用户名/仓库名.git 替换成你的仓库路径。

3. 第一次连接需要确认主机指纹(验证)

测试连接(任意一个即可,都执行也行):

1
2
ssh -T git@github.com
ssh -T -p 443 git@ssh.github.com

会提示:

1
2
3
The authenticity of host '[ssh.github.com]:443 ...' can't be established.
ECDSA key fingerprint is SHA256:...
Are you sure you want to continue connecting (yes/no)?

输入完整的 yes 并回车,SSH 会把主机写入 ~/.ssh/known_hosts,以后就不再提示。成功后应看到:

1
Hi <你的用户名>! You've successfully authenticated, but GitHub does not provide shell access.

🎉 表示配置成功,现在你可以正常执行 git push 了!

4. 推送代码

1
git push

现在 SSH 走 443 端口,推送应该稳定可用。适合任何仓库、任何网络环境。


5. 恢复默认 22 端口(可选)

如果网络环境允许,想还原默认 SSH:

1
git remote set-url origin git@github.com:用户名/仓库名.git

再推送就会回到原来的 22 端口方式。


7. 修改本地 SSH 配置文件(另一种方法)

如果上面的方法无效,可尝试这里的方法:通过修改本地 SSH 配置文件,让所有对 github.com 的 SSH 请求自动转发到 ssh.github.com:443

1. 配置文件路径

平台 路径
Linux / macOS ~/.ssh/config
Windows(Git Bash) C:\Users\<用户名>\.ssh\config

注意:.ssh 目录和 config 文件权限需设置正确,避免 SSH 拒绝加载。

1
2
chmod 700 ~/.ssh
chmod 600 ~/.ssh/config

2. 添加配置内容

如果已有其他 Host 配置(如私有服务器 IP),不要删除或覆盖,只需 追加 即可。SSH 会按 Host 匹配规则自动选择。

打开或创建 ~/.ssh/config,添加以下内容:

1
2
3
4
Host github.com
HostName ssh.github.com
Port 443 # 可以直接改成 22 或者更简单地 直接删除整个 Host github.com 块,就等于 恢复默认行为:走 github.com: 22。
User git

说明

  • Host github.com:匹配所有 git@github.com:xxx/yyy.git 的请求。
  • HostName ssh.github.com:GitHub 提供的 SSH over HTTPS 网关。
  • Port 443:使用 HTTPS 常用端口,绕过 22 端口封锁。
  • User git:SSH 协议要求用户为 git

后面的步骤就和上面一样了:验证和推送。