用 Windows SSH 解决 HTTPS 协议访问 GitHub 总是失败的问题
什么是 SSH?#
SSH(全称 Secure Shell)是一种网络协议,用于通过加密方式安全地访问远程计算机。就像常见的 shell(如 bash、zsh)一样,SSH 允许用户在远程机器上执行命令,然而它比传统的 shell 更加 安全。
SSH 使用非对称加密,公开密钥(公钥)用于远程验证连接是否合法,私钥则用于本地验证身份。由于 SSH 具有高度的安全性和便捷性,现在几乎所有平台都支持 SSH,而且平台间的差异也不大(尽管在某些特定场景下可能会有差异)。
用 SSH 访问 GitHub#
在 GitHub 上使用 HTTPS 协议时,可能会遇到各种连接问题。为了解决这些问题,可以通过 SSH 协议替代 HTTPS 来访问 GitHub,这样既能避免 HTTPS 的复杂性,也能提高安全性。
通过 SSH,我们首先需要生成一对公私钥,将公钥上传到 GitHub,这样每次访问时就可以通过公钥验证身份,而无需频繁输入密码。
在 Windows 下使用 SSH 访问 GitHub#
Windows 已经集成了 OpenSSH 客户端,可以直接在 CMD 或 PowerShell 中使用 SSH。我们首先需要确保已安装并启用 OpenSSH 客户端。
1. 检查 SSH 是否已安装#
打开 CMD 或 PowerShell,输入以下命令检查 SSH 是否可用:
1 | ssh |
如果看到类似以下的信息,说明 SSH 已经安装并可以使用:
1 | usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface] [-b bind_address] |
2. 生成 SSH 密钥对#
接下来,我们需要生成一对 SSH 密钥(公钥和私钥)。在 CMD 或 PowerShell 中输入以下命令:
1 | ssh-keygen -t rsa -b 4096 |
这里参数的意思是:
-t rsa
:指定密钥类型为 RSA(也可以使用dsa
、ecdsa
等,但 RSA 是最常用的)。-b 4096
:指定密钥长度为 4096 位,密钥可以是256,512等等。
生成密钥时,系统会提示你选择保存位置(默认是 C:\Users\<username>\.ssh\id_rsa
)以及是否为密钥设置密码。如果你不希望每次使用时都输入密码,可以直接按 回车 跳过设置密码。
3. 查看并复制公钥#
生成完密钥对后,公钥保存在 C:\Users\<username>\.ssh\id_rsa.pub
文件中。你可以使用以下命令查看并复制公钥:
1 | type .ssh\id_rsa.pub |
将公钥内容复制下来,接下来我们要将它添加到 GitHub。
4. 将公钥添加到 GitHub#
在浏览器中打开 GitHub SSH 密钥管理页面,点击 New SSH key,在 Title 输入框中填入一个描述(例如:My Windows Machine
),然后将刚刚复制的公钥粘贴到 Key 输入框中,点击 Add SSH key。
5. 测试 SSH 连接#
完成公钥添加后,可以通过以下命令测试 SSH 连接是否成功:
1 | ssh -T git@github.com |
如果连接成功,你将看到类似下面的欢迎信息:
1 | Hi <your-username>! You've successfully authenticated, but GitHub does not provide shell access. |
解决端口问题#
有时,由于网络或防火墙的原因,默认的 SSH 端口(22)可能无法正常连接。为了绕过这个问题,你可以将 SSH 连接的端口设置为 GitHub 的备用端口 443。
在 .ssh\config
文件中添加以下内容:
1 | Host github.com |
这样就可以通过端口 443 进行连接,而不是默认的端口 22。
使用 ssh-agent
管理密钥#
如果不使用 ssh-agent
,每次重启计算机或关闭会话后,你都需要重新加载 SSH 密钥。ssh-agent
可以帮助你在一个会话中缓存和管理密钥,无需每次手动加载。
1. 启动 ssh-agent
#
在 管理员PowerShell 中,运行以下命令启动 ssh-agent
:
1 | Start-Service ssh-agent |
2. 将 SSH 密钥添加到 ssh-agent
#
然后,将你的私钥添加到 ssh-agent
:
1 | ssh-add ~/.ssh/id_rsa |