Git 添加 SSH 密钥、多个 SSH 密钥教程

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

创建密钥

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

密钥创建命令:

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):

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

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