Skip to content

Git 客户端配置 SSH 验证

标签
开发/Git
命令行/git
网站/GitLab
网站/GitHub
命令行/ssh
开源/软件/ssh
操作系统/macOS
操作系统/Linux
安全
密码学/非对称加密
密码学/算法/RSA
密码学/算法/ECDSA
字数
2082 字
阅读时间
9 分钟

macOS / Linux

创建 SSH 密钥对

SSH 密钥对是两个基于非对称加密算法生成的文件:

  1. 一个是公钥文件,拓展名通常以 pub 或者 pem 结尾
  2. 一个是私钥文件,拓展名通常以 key 为结尾,或是无拓展名

SSH 密钥对存储位置

SSH 相关的密钥、文件,都应该放到 $HOME/.ssh 目录下,也就是个人用户目录的 .ssh 目录,这个目录下,存放着以下几种文件:

  1. config - SSH 连接配置文件
  2. xxx_rsa - RSA 私钥文件,xxx 有可能是 id,也有可能是别的名字
  3. xxx_rsa.pub - RSA 私钥对应的公钥文件,xxx 有可能是 id,也有可能是别的名字
  4. authorized_keys - 远程连接 SSH 时验证的公钥文件,每行一个公钥,发起请求用的 SSH 客户端是不会需要配置的

如果没有这个目录,需要使用 mkdir 命令(参考 mkdir 创建目录)手动创建该目录

shell
mkdir $HOME/.ssh

⚠️ 注意:创建时应该使用对应的用户进行创建。如果你现在在 /home/rizumu 目录(如果不知道你现在在哪个目录,可以通过 pwd 命令来获得),则应该使用 rizumu 用户创建,而不是 root

shell
sudo su rizumu # 切换用户到 rizumu
mkdir $HOME/.ssh # 创建目录

SSH 密钥对存储位置的权限配置

此处还需要注意的是 .ssh 目录和该目录下的文件权限,都有不同的要求: 权限说明:Linux 权限

  1. .ssh 目录要求 700 (`drwx------``)
  2. .pub 公钥文件(包括但不限于 .pub 文件)要求 644 (-rw-r--r--)
  3. authorized_keys(远程服务端)和 私钥文件(本地)要求 600 (-rw-------)

新建 .ssh 目录之后需要改变权限值

使用 chmod 命令(参考 chmod 变更权限)进行调整

shell
chmod 644 .ssh

开始生成 SSH 密钥对

使用 cd 命令(参考 cd 变更目录)切换到 $HOME/.ssh 目录,也可以使用 ~/.ssh 来表示
shell
cd $HOME/.ssh
使用 ssh-keygen 命令创建密钥对

我们可以使用 ssh-keygen 命令(参考 ssh-keygen 创建 SSH 密钥)来创建 SSH 密钥对,此处的参数:

  1. t 表示算法,我们指定算法为 RSA
  2. b 表示位数,我们指定为 4096 位的 RSA 密钥
shell
ssh-keygen -t rsa -b 4096 -C "<GitHub 账号的电子邮件地址>"

执行命令后会有次需要输入额外信息,完整流程见下方:

此处需要填写私钥文件名称,github 的话可以填写 github_rsa

shell
Generating public/private rsa key pair.
Enter file in which to save the key (/home/neko/.ssh/id_rsa): github_rsa

设定私钥的密码,如果不希望每次使用都输入密码,可以留空,直接回车

shell
Enter passphrase (empty for no passphrase):

确认密码,如果留空,直接回车

shell
Enter same passphrase again:

完整的流程:

shell
$ ssh-keygen -t rsa -b 4096 -C "neko@ayaka.moe"
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 yuna@Ayaka-MBP.local
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 输出文件)完成

shell
cat ~/.ssh/github_rsa.pub # github_rsa 是上一步命名的私钥名称,公钥文件名直接在私钥文件名后面加 .pub 即可,可以根据自己的需求填写

复制里面的内容粘贴到 GitHub 的页面表单内即可

配置本地 SSH 连接

我们需要去 $HOME/.ssh/config 文件中配置我们的连接,使用偏好的编辑器打开这个文件:

shell
vim ~/.ssh/config
shell
# 需要预先在 Visual Studio Code 中通过命令面板 command Palette(可以在 Windows 和 Linux 上通过 Ctrl + Shift + P 或者在 macOS 上通过 command + Shift + P)
code ~/.ssh/config
shell
nano ~/.ssh/config

一般情况下,为 Git 配置的 SSH 配置文件的格式如下

ssh-config
Host <连接时在输入 ssh 命令时引用的域名别名>
    HostName <Git 服务器>
    User <用户名>
    Port <端口>
    IdentityFile <公钥所在的路径>
  1. Host:域,等同于别名,比如我们可以在这个字段中填写 gh,下面的 HostName 填写 github.com,则连接的时候我们输入并执行 ssh gh 就可以自动指向到 github.com,这个地方选择自己喜欢的方式命名即可,比如我喜欢 <用户名>.git 这样(nekomeowww.git),这样多用户的时候可以方便配置
  2. HostName:域名,需要连接的远程服务器域名或是 IP 地址,GitHub 的 SSH 需要填写 github.com,GitLab 则填写 gitlab.com,如果是自建的 GitLab 实例,则需要填写对应的实例域名或是 IP
  3. User:用户,连接时使用的用户,对于 GitHub SSH 而言,默认填写 git,不用写为自己的用户名,服务器那边会通过你的公钥自动判断的
  4. IdentityFile:身份文件,一般是 RSA 密钥的私钥文件,格式不限,只要是复合 OpenSSH 规范的即可

如果你使用 1Password CLI,也可以省略掉 IdentityFile

ssh-config
Host <连接时在输入 ssh 命令时引用的域名别名>
    HostName <Git 服务器>
    User <用户名>
    Port <端口>

我们往 ~/.ssh/config 文件中写入上面自定义好的内容即可。也可以参考下面的配置:

shell
Host github.com
  User git
  HostName github.com
  Port 22
  IdentityFile ~/.ssh/id_rsa.pub # 记得改成自己的公钥所在的位置
shell
Host gitlab.com
  User git
  HostName gitlab.com
  Port 22
  IdentityFile ~/.ssh/id_rsa.pub # 记得改成自己的公钥所在的位置

当然你也可以参考我的配置:

ssh-config
Host nekomeowww.git
    HostName ssh.github.com
    User git
    Port 443
    IdentityFile ~/.ssh/nekomeowww_rsa

测试 GitHub 连接

使用 ssh 命令加上参数 T 来测试

shell
ssh -T <> # 别名填写上面 Host 字段的值

比如如果用大家最常用的配置的话:

ssh-config
Host github.com
  User git
  HostName github.com
  Port 22
  IdentityFile ~/.ssh/id_rsa.pub # 记得改成自己的公钥所在的位置

那么就输入

shell
ssh -T github.com

来进行配置。

遭遇到了 error: kex_exchange_identification: Connection closed by remote host 错误?

如果你在中国大陆进行访问,那么首先在中国大陆通过 22 端口连接到 github.com 就是被防火墙禁止的,如果你已经使用了梯子进行科学上网,也依然可能会遭遇因梯子提供商封禁 22 端口的代理而遭遇上述错误。

这个时候你需要根据官方指引的通过 HTTPS 端口使用 SSH 配置使用 ssh.github.com 域名和 443 端口进行访问:

ssh-config
Host github.com
  User git
  HostName ssh.github.com
  Port 443
  IdentityFile ~/.ssh/id_rsa.pub

正常情况下的测试结果:

shell
ssh -T nekomeowww.git
Hi nekomeowww! You've successfully authenticated, but GitHub does not provide shell access.

出现这样的字样就说明配置完成了,可以在 Git 命令行工具中使用了。

实际使用方式

以我的配置为例:

ssh-config
Host github.com
  User git
  HostName ssh.github.com
  Port 443
  IdentityFile ~/.ssh/nekomeowww_2023.pub

Git 克隆命令:

shell
git clone nekomeowww.git:nekomeowww/repo.git

为老的仓库设定使用 SSH 连接:

shell
git remote set-url origin nekomeowww.git:nekomeowww/repo.git

贡献者

页面历史

撰写

布局切换

调整 VitePress 的布局样式,以适配不同的阅读习惯和屏幕环境。

全部展开
使侧边栏和内容区域占据整个屏幕的全部宽度。
全部展开,但侧边栏宽度可调
侧边栏宽度可调,但内容区域宽度不变,调整后的侧边栏将可以占据整个屏幕的最大宽度。
全部展开,且侧边栏和内容区域宽度均可调
侧边栏宽度可调,但内容区域宽度不变,调整后的侧边栏将可以占据整个屏幕的最大宽度。
原始宽度
原始的 VitePress 默认布局宽度

页面最大宽度

调整 VitePress 布局中页面的宽度,以适配不同的阅读习惯和屏幕环境。

调整页面最大宽度
一个可调整的滑块,用于选择和自定义页面最大宽度。

内容最大宽度

调整 VitePress 布局中内容区域的宽度,以适配不同的阅读习惯和屏幕环境。

调整内容最大宽度
一个可调整的滑块,用于选择和自定义内容最大宽度。

聚光灯

支持在正文中高亮当前鼠标悬停的行和元素,以优化阅读和专注困难的用户的阅读体验。

ON开启
开启聚光灯。
OFF关闭
关闭聚光灯。

聚光灯样式

调整聚光灯的样式。

置于底部
在当前鼠标悬停的元素下方添加一个纯色背景以突出显示当前鼠标悬停的位置。
置于侧边
在当前鼠标悬停的元素旁边添加一条固定的纯色线以突出显示当前鼠标悬停的位置。