拥抱伟大的Ssh

用 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 是否已安装#

打开 CMDPowerShell,输入以下命令检查 SSH 是否可用:

1
ssh

如果看到类似以下的信息,说明 SSH 已经安装并可以使用:

1
2
3
4
5
6
7
usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface] [-b bind_address]
[-c cipher_spec] [-D [bind_address:]port] [-E log_file]
[-e escape_char] [-F configfile] [-I pkcs11] [-i identity_file]
[-J destination] [-L address] [-l login_name] [-m mac_spec]
[-O ctl_cmd] [-o option] [-P tag] [-p port] [-Q query_option]
[-R address] [-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]]
destination [command [argument ...]]

2. 生成 SSH 密钥对#

接下来,我们需要生成一对 SSH 密钥(公钥和私钥)。在 CMDPowerShell 中输入以下命令:

1
ssh-keygen -t rsa -b 4096

这里参数的意思是:

  • -t rsa:指定密钥类型为 RSA(也可以使用 dsaecdsa 等,但 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
2
3
Host github.com
Hostname ssh.github.com
Port 443

这样就可以通过端口 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