配置 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.pub | id_ed25519 |
| RSA (不推荐) | id_rsa.pub | id_rsa |
步骤一 SSH 密钥
在生成新的 SSH 密钥前,请先确认是否需要使用本地已生成的SSH密钥,SSH 密钥对一般存放在本地用户的根目录下.
Linux、Mac 请直接使用以下命令查看已存在的公钥,Windows 用户在 WSL(需要win10或以上)或Git Bash下使用以下命令查看已生成公钥:
ED25519 算法
cat ~/.ssh/id_ed25519.pubRSA 算法
cat ~/.ssh/id_rsa.pub如果返回一长串以 ssh-ed25519 或 ssh-rsa 开头的字符串, 说明已存在本地公钥,你可以跳过步骤二生成 SSH 密钥,直接操作步骤三.
步骤二 SSH 密钥
若步骤一未返回指定内容字符串,表示本地暂无可用 SSH 密钥,需要生成新的 SSH 密钥,请按如下步骤操作:
注释会出现在.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_newssh-keygen -t rsa -C "<注释内容>" -f ~/.ssh/id_rsa_new生成出来的文件就是~/.ssh/id_ed25519_new或者~/.ssh/id_rsa_new
- 点击回车,选择 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.
- 设置一个密钥口令.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:口令默认为空,你可以选择使用口令保护私钥文件.如果你不想在每次使用 SSH 协议访问仓库时,都要输入用于保护私钥文件的口令,可以在创建密钥时,输入空口令.
- 点击回车,完成密钥对创建.
警告
密钥用于鉴权,请谨慎保管.公钥文件以 .pub 扩展名结尾,可以公开给其他人,而没有 .pub 扩展名的私钥文件不要泄露给任何人!
步骤三
除了在命令行打印出已生成的公钥信息手动复制外,可以使用命令拷贝公钥到粘贴板下,请参考操作系统使用以下命令进行拷贝:
cat ~/.ssh/id_ed25519.pub | clipMac:
tr -d '\n' < ~/.ssh/id_ed25519.pub | pbcopyGNU/Linux (requires xclip):
xclip -sel clip < ~/.ssh/id_ed25519.pub步骤四(GitHub)
- 进入个人信息页面

- SSH and GPG keys

- 添加一个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 平台请使用WSL或Git 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