Git 客户端配置 SSH 验证
macOS / Linux / Windows
创建 SSH 密钥对
SSH 密钥对是两个基于非对称加密算法生成的文件:
- 一个是公钥文件,拓展名通常以
pub或者pem结尾 - 一个是私钥文件,拓展名通常以
key为结尾,或是无拓展名
SSH 密钥对存储位置
macOS / Linux / Windows
SSH 相关的密钥、文件,都应该放到 $HOME/.ssh 目录下,也就是个人用户目录的 .ssh 目录,这个目录下,存放着以下几种文件:
config- SSH 连接配置文件xxx_rsa- RSA 私钥文件,xxx有可能是id,也有可能是别的名字xxx_rsa.pub- RSA 私钥对应的公钥文件,xxx有可能是id,也有可能是别的名字authorized_keys- 远程连接 SSH 时验证的公钥文件,每行一个公钥,发起请求用的 SSH 客户端是不会需要配置的。known_hosts和known_hosts.old是存储已知的远程主机公钥和备份
$HOME 在 Windows 的路径是 C:\Users\你的用户名\
NOTE
- 如果没有这个目录,需要使用
mkdir命令(参考 mkdir 创建目录)手动创建该目录 - 在 Windows 的
%USERDATA%目录中如果没有.ssh文件夹,请到「资源管理器」的「开发者选项」下,打开「显示隐藏和系统文件」
mkdir $HOME/.ssh⚠️ 注意:创建时应该使用对应的用户进行创建。如果你现在在 /home/rizumu 目录(如果不知道你现在在哪个目录,可以通过 pwd 命令来获得),则应该使用 rizumu 用户创建,而不是 root
sudo su rizumu # 切换用户到 rizumu
mkdir $HOME/.ssh # 创建目录⚠️ 注意:Windows需要关闭系统的OpenSSH Authentication Agent服务
手动操作:
在 OpenSSH Authentication Agent 服务中,先「停止」然后在启动类型里选择「禁用」,完成后点击「应用」
CMD 操作:
sc stop ssh-agent
sc config ssh-agent start= disabledSTATE 显示 STOP_PENDING 即正常停止中
start= 后面一定要加空格再输入 disabled
SSH 密钥对存储位置的权限配置
macOS / Linux / Windows
此处还需要注意的是 .ssh 目录和该目录下的文件权限,都有不同的要求: 权限说明:Linux 权限
.ssh目录要求 700 (`drwx------``).pub公钥文件(包括但不限于.pub文件)要求 644 (-rw-r--r--)authorized_keys(远程服务端)和 私钥文件(本地)要求 600 (-rw-------)
开始生成 SSH 密钥对
使用 cd 命令(参考 cd 变更目录)切换到 $HOME/.ssh 目录,也可以使用 ~/.ssh 来表示
cd $HOME/.ssh使用 ssh-keygen 命令创建密钥对
我们可以使用 ssh-keygen 命令(参考 ssh-keygen 创建 SSH 密钥)来创建 SSH 密钥对,此处的参数:
t表示算法,我们指定算法为 RSAb表示位数,我们指定为 4096 位的 RSA 密钥
ssh-keygen -t rsa -b 4096 -C "<GitHub 账号的电子邮件地址>"执行命令后会有次需要输入额外信息,完整流程见下方:
此处需要填写私钥文件名称,github 的话可以填写 github_rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/neko/.ssh/id_rsa): github_rsa设定私钥的密码,如果不希望每次使用都输入密码,可以留空,直接回车
Enter passphrase (empty for no passphrase):确认密码,如果留空,直接回车
Enter same passphrase again:完整的流程:
$ ssh-keygen -t rsa -b 4096 -C "[email protected]"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/neko/.ssh/id_rsa): github_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in github_rsa. # 私钥已保存 github_rsa
Your public key has been saved in github_rsa.pub. # 公钥已保存为 github_rsa.pub
The key fingerprint is: # 密钥对指纹为:
SHA256:3P4U6I/ROsAaUJdYTAVHpZk02D80aTAjpIf4XDIDPUA [email protected]
The key's randomart image is: # 随机码的可视化
+---[RSA 4096]----+
| .Eo **BXo.. |
| o=o=+.B= |
| ..*oo ++ . |
| .o B . .o |
| .o.S o .. |
| . oo . . |
| o .+ o |
| . .B |
| o.o |
+----[SHA256]-----+现在就创建完毕了。私钥的文件存放在 ~/.ssh/<填写的私钥文件名>内,公钥存放在 ~/.ssh/<填写的私钥文件名>.pub 内
配置 GitHub 的 SSH
创建新的 GitHub SSH 密钥条目
前往 GitHub 个人设置 | SSH 与 GPG 密钥 页面进行设置

点选 SSH Keys 右手边的绿色按钮 New SSH Key 来上传我们的公钥

填写标题和公钥内容
标题只需要你看得懂,作为备注信息就好了。 获取公钥可以通过 cat 命令(参考 cat 输出文件)完成
cat ~/.ssh/github_rsa.pub # github_rsa 是上一步命名的私钥名称,公钥文件名直接在私钥文件名后面加 .pub 即可,可以根据自己的需求填写复制里面的内容粘贴到 GitHub 的页面表单内即可
配置本地 SSH 连接
我们需要去 $HOME/.ssh/config 文件中配置我们的连接,使用偏好的编辑器打开这个文件:
vim ~/.ssh/config# 需要预先在 Visual Studio Code 中通过命令面板 command Palette(可以在 Windows 和 Linux 上通过 Ctrl + Shift + P 或者在 macOS 上通过 command + Shift + P)
code ~/.ssh/confignano ~/.ssh/config一般情况下,为 Git 配置的 SSH 配置文件的格式如下
Host <连接时在输入 ssh 命令时引用的域名别名>
HostName <Git 服务器>
User <用户名>
Port <端口>
IdentityFile <公钥所在的路径>- Host:域,等同于别名,比如我们可以在这个字段中填写
gh,下面的HostName填写github.com,则连接的时候我们输入并执行ssh gh就可以自动指向到github.com,这个地方选择自己喜欢的方式命名即可,比如我喜欢<用户名>.git这样(nekomeowww.git),这样多用户的时候可以方便配置 - HostName:域名,需要连接的远程服务器域名或是 IP 地址,GitHub 的 SSH 需要填写 github.com,GitLab 则填写 gitlab.com,如果是自建的 GitLab 实例,则需要填写对应的实例域名或是 IP
- User:用户,连接时使用的用户,对于 GitHub SSH 而言,默认填写 git,不用写为自己的用户名,服务器那边会通过你的公钥自动判断的
- IdentityFile:身份文件,一般是 RSA 密钥的私钥文件,格式不限,只要是复合 OpenSSH 规范的即可
如果你使用 1Password CLI,也可以省略掉 `IdentityFile`
Host <连接时在输入 ssh 命令时引用的域名别名>
HostName <Git 服务器>
User <用户名>
Port <端口>我们往 ~/.ssh/config 文件中写入上面自定义好的内容即可。也可以参考下面的配置:
Host github.com
User git
HostName github.com
Port 22
IdentityFile ~/.ssh/id_rsa.pub # 记得改成自己的公钥所在的位置Host gitlab.com
User git
HostName gitlab.com
Port 22
IdentityFile ~/.ssh/id_rsa.pub # 记得改成自己的公钥所在的位置当然你也可以参考我的配置:
Host nekomeowww.git
HostName ssh.github.com
User git
Port 443
IdentityFile ~/.ssh/nekomeowww_rsa测试 GitHub 连接
使用 ssh 命令加上参数 T 来测试
ssh -T <别名> # 别名填写上面 Host 字段的值比如如果用大家最常用的配置的话:
Host github.com
User git
HostName github.com
Port 22
IdentityFile ~/.ssh/id_rsa.pub # 记得改成自己的公钥所在的位置那么就输入
ssh -T github.com来进行配置。
遭遇到了 `error: kex_exchange_identification: Connection closed by remote host` 错误?
如果你在中国大陆进行访问,那么首先在中国大陆通过 22 端口连接到 github.com 就是被防火墙禁止的,如果你已经使用了梯子进行科学上网,也依然可能会遭遇因梯子提供商封禁 22 端口的代理而遭遇上述错误。
这个时候你需要根据官方指引的通过 HTTPS 端口使用 SSH 配置使用 ssh.github.com 域名和 443 端口进行访问:
Host github.com
User git
HostName ssh.github.com
Port 443
IdentityFile ~/.ssh/id_rsa.pub正常情况下的测试结果:
ssh -T nekomeowww.git
Hi nekomeowww! You've successfully authenticated, but GitHub does not provide shell access.出现这样的字样就说明配置完成了,可以在 Git 命令行工具中使用了。
实际使用方式
以我的配置为例:
Host github.com
User git
HostName ssh.github.com
Port 443
IdentityFile ~/.ssh/nekomeowww_2023.pubGit 克隆命令:
git clone nekomeowww.git:nekomeowww/repo.git为老的仓库设定使用 SSH 连接:
git remote set-url origin nekomeowww.git:nekomeowww/repo.git贡献者
絢香猫