配置 SSH 密钥

前提条件

  • 本机已安装 Git(安装教程参见安装Git)并保证版本大于 1.9(通过git —version可获取本地的版本).

  • 本机需要安装 OpenSSH 客户端(GNU/Linux, macOS, 或 Windows 10 已内置 OpenSSH).

  • SSH 尽量保持最新,6.5之前的版本由于使用 MD5 签名,可能存在安全问题.

重要

如果你是 Windows 用户,在使用 Git 命令时,请使用 WSL(需要win10或以上)或Git Bash,或使用 Git Bash.

算法类型公钥私钥
ED25519 (推荐)id_ed25519.pubid_ed25519
RSA (不推荐)id_rsa.pubid_rsa

步骤一
SSH 密钥

在生成新的 SSH 密钥前,请先确认是否需要使用本地已生成的SSH密钥,SSH 密钥对一般存放在本地用户的根目录下.

Linux、Mac 请直接使用以下命令查看已存在的公钥,Windows 用户在 WSL(需要win10或以上)或Git Bash下使用以下命令查看已生成公钥:

ED25519 算法

cat ~/.ssh/id_ed25519.pub

RSA 算法

cat ~/.ssh/id_rsa.pub

如果返回一长串以 ssh-ed25519 或 ssh-rsa 开头的字符串, 说明已存在本地公钥,你可以跳过步骤二生成 SSH 密钥,直接操作步骤三.

步骤二
SSH 密钥

若步骤一未返回指定内容字符串,表示本地暂无可用 SSH 密钥,需要生成新的 SSH 密钥,请按如下步骤操作:

  1. 访问终端WSLGit Bash,运行ssh-keygen -t.

  2. 输入密钥算法类型和可选的注释.

注释会出现在.pub文件中,一般可使用邮箱作为注释内容.

  • 基于ED25519算法,生成密钥对命令如下:
ssh-keygen -t ed25519 -C "<注释内容>"
  • 基于RSA算法,生成密钥对命令如下:
ssh-keygen -t rsa -C "<注释内容>"
  • ‘-f’参数指定密钥保存路径以及文件名(不加’-f’默认生成在 /.ssh/id_rsa或者/.ssh/id_ed25519)
ssh-keygen -t ed25519 -C "<注释内容>" -f ~/.ssh/id_ed25519_new
ssh-keygen -t rsa -C "<注释内容>" -f ~/.ssh/id_rsa_new

生成出来的文件就是~/.ssh/id_ed25519_new或者~/.ssh/id_rsa_new

  1. 点击回车,选择 SSH 密钥生成路径.
  • 以 ED25519 算法为例,默认路径如下:
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/user/.ssh/id_ed25519):

密钥默认生成路径:/home/user/.ssh/id_ed25519,公钥与之对应为:/home/user/.ssh/id_ed25519.pub.

  • 以 RSA 算法为例,默认路径如下:
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):

密钥默认生成路径:/home/user/.ssh/id_rsa,公钥与之对应为:/home/user/.ssh/id_rsa.pub.

  1. 设置一个密钥口令.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

口令默认为空,你可以选择使用口令保护私钥文件.如果你不想在每次使用 SSH 协议访问仓库时,都要输入用于保护私钥文件的口令,可以在创建密钥时,输入空口令.

  1. 点击回车,完成密钥对创建.

警告

密钥用于鉴权,请谨慎保管.公钥文件以 .pub 扩展名结尾,可以公开给其他人,而没有 .pub 扩展名的私钥文件不要泄露给任何人!

步骤三

除了在命令行打印出已生成的公钥信息手动复制外,可以使用命令拷贝公钥到粘贴板下,请参考操作系统使用以下命令进行拷贝:

Windows(在WSLGit Bash下):

cat ~/.ssh/id_ed25519.pub | clip

Mac:

tr -d '\n' < ~/.ssh/id_ed25519.pub | pbcopy

GNU/Linux (requires xclip):

xclip -sel clip < ~/.ssh/id_ed25519.pub

步骤四
(GitHub)

  1. 进入个人信息页面

profile

  1. SSH and GPG keys

SSH and GPG keys

  1. 添加一个ssh key

New SSH Key

常见问题

本地存在多个密钥时,如何根据目标平台自动选择用于认证的密钥?
当本地存在多个密钥,如果不设置认证规则,本机将随机选择一个密钥用于认证,可能造成认证失败.

因此,在如下场景中,需要自行定义认证密钥的路径:

本地存在多个密钥对应不同的代码平台(GitLab,GitHub,云效等).

设置ssh端口(22端口无法推送时设置)
编辑~/.ssh/config添加一下内容(HostName与Port)

Host github.com
    Hostname ssh.github.com
    Port 443
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_ed25519

定义认证密钥路径规则
打开本地终端,按如下格式编辑~/.ssh/config文件,如 Windows 平台请使用WSLGit Bash:

# Codeup 示例用户1,设置别名 codeup-user1
Host codeup-user1
    HostName codeup.aliyun.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_ed25519_user1

# Codeup 示例用户2,设置别名 codeup-user2
Host codeup-user2
    HostName codeup.aliyun.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_ed25519_user2

# Github 平台
Host github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_ed25519

按照上述配置,使用SSH协议访问时,SSH 客户端会使用文件指定的密钥进行认证,实现访问不同平台或同一平台的不同账号使用本地不同的 SSH 密钥进行认证.

  • 访问 Codeup,由于HostName一致,使用别名进行区分使用不同的密钥.
  • 访问 Github,根据HostName进行区分使用不同的密钥.
  • user与仓库的所有者一致.
# 以codeup-user1别名访问Codeup时,将使用 ~/.ssh/id_ed25519_user1密钥
git clone git@codeup-user1:user/repo.com

# 以codeup-user2别名访问Codeup时,将使用 ~/.ssh/cid_ed25519_user2密钥
git clone git@codeup-user2:user/repo.com

# 访问 Github 平台,将使用 ~/.ssh/id_ed25519 密钥
git clone git@github.com:user/repo.com