> ## Content Index
> Fetch the complete content index at: https://sgpublic.xyz/llms.txt
> Use this file to discover other available public pages before exploring further.

# Git 添加 SSH 密钥、多个 SSH 密钥教程
- URL: https://sgpublic.xyz/p/2024/02/6aac9cb1810a4800015335fb/
- Published: 2024-02-22T08:00:39.000Z
- Updated: 2024-02-22T08:00:39.000Z
- Author: Haven Madray
- Tags: 软件开发, Git, #wp-post

教程仅详细说明如何创建密钥，至于如何将密钥上传至 Git 托管平台请查阅对应平台的帮助文档。

## 创建密钥

创建密钥推荐在 Linux 上操作，例如 Debian 等，因为其自带相关工具不用额外操作。

密钥创建命令：

```bash
ssh-keygen -t ed25519 -C your_email@example.com
```

- `-t`：这个是密钥格式，一般来讲可以用 `ed25519`，部分老平台可能不支持这个算法，此时可以换成 `rsa`。
- `-C`：此参数实际作用为添加注解，用于区分不同密钥，简单来讲就是取个名字。

创建过程：

```
madray@NAS:~$ ssh-keygen -t ed25519 -C your_email@example.com
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/madray/.ssh/id_ed25519): # 这个是密钥保存路径，可以换个路径，括号内的是默认路径
Enter passphrase (empty for no passphrase): # 留空即可，直接回车
Enter same passphrase again: # 留空即可，直接回车
Your identification has been saved in /home/madray/.ssh/id_ed25519
Your public key has been saved in /home/madray/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:... your_email@example.com
The key's randomart image is:
+--[ED25519 256]--+
...
+----[SHA256]-----+
```

假设这里没有更换密钥保存路径，即 `/home/madray/.ssh/id_ed25519`，那么生成完成之后，在 `/home/madray/.ssh` 目录下会生成两个文件：

- `id_ed25519`：这个是私钥文件，下载下来妥善保存，可以任意修改文件名。
- `id_ed25519.pub`：这个是公钥文件，内容用于上传到 Git 托管平台。

## 本地配置 SSH

创建完 SSH 密钥之后，就需要保存到本地然后应用了，这里介绍一种可以配置多个 Git 托管平台使用不同密钥的方法。

首先创建目录 `~/.ssh`（Windows 下是类似 `C:\Users\xxx\.ssh` 的目录），然后创建文件 `config`：

```
# gitee
Host gitee.com
    HostName gitee.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/gitee_ed25519
    Port 22
github
Host github.com
HostName ssh.github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/github_ed25519
Port 443
gitlab
Host gitlab.sgpublic.xyz
HostName gitlab.sgpublic.xyz
PreferredAuthentications publickey
IdentityFile ~/.ssh/gitlab_ed25519
Port 14022
```

其中对于每个小节的解释如下：

- Host：Git 仓库连接中的主机域名，例如 `git@github.com:user/repo` 中 Host 为 `github.com`。
- HostName：设置此 Host 实际连接时使用的主机域名，默认使用 Host。例如上面配置文件中 github 部分，配置 `github.com` 实际连接的时候使用域名 `ssh.github.com` 且端口设置使用 443，则可以在代理软件仅代理常用端口时让连接走代理。
- PreferredAuthentications：首选认证方式，此处固定配置为 `publickey`。
- IdentityFile：就是所使用的私钥文件了，就是前文中生成的私钥文件。如上所示的示例配置文件中虽然使用类似 `~/.ssh` 这种类 Unix 才能使用的路径，但在 Windows 中也是适用的。
- Port：设置实际链接时使用的端口，默认为 22。

如此就完成了不同 Git 托管平台使用不同密钥了。

## 测试配置

使用以下命令测试（示例为测试 `github.com` 连接性，用户名为 `git`）：

```bat
C:\Users\sgpub>ssh -T git@github.com
Hi sgpublic! You've successfully authenticated, but GitHub does not provide shell access.
```

关于用户名是什么的问题，具体取决于 Git 托管平台，常规来讲例如 `github.com` 和 `gitee.com` 等使用的是 `git`。