简介
SSH 通常有密码登录和密钥登录两种方式。密钥登录时使用的是 SSH 的密钥,由 ssh-agent 来处理。这里介绍使用 GnuPG 生成的 PGP 密钥来登录 SSH。此时使用 gpg-agent 来处理登录过程。
使用 GPG 密钥登录的好处是便于管理服务器。只要把 GPG 密钥的公钥放到服务器上面,用同一个密钥可以登录所有这些服务器。还有,GnuPG 可以使用智能卡来保存密钥,使 SSH 密钥更加安全。
注意:
这篇文章使用 Ubuntu 18.04,并使用 GnuPG v2.2.X 来演示,小于 v2.2.X 的版本下文某些命令可能是无效的。运行如下命令查看版本:
1 | gpg --version |
生成 GnuPG 密钥并添加认证密钥
快速生成 GnuPG 密钥的方法详见 这里
分步生成 GnuPG 密钥的方法详见:
生成属于自己的一对密钥后,再向这个密钥中添加一个认证密钥[A]。
最后,密钥看起来像下面这样。[A] 子密钥用于认证,即用于 SSH 登录:
1 | $ gpg --list-key 0AAABBCCDDDDDDDDDDDDDDDDFFFFFFFXXXXXXXXZ |
设置用于 SSH 登录
配置 gpg-agent 选项
1 | vim ~/.gnupg/gpg-agent.conf |
修改 .bashrc 文件
让 ssh 与 gpg-agent 通信,而不是 ssh-agent。
1 | # 在 .bashrc 文件末尾添加如下一行 |
为了使更改生效,运行如下命令:
1 | killall gpg-agent |
获取认证密钥的 keygrip
为了告诉 gpg-agent 应该使用哪个认证子密钥,需要先获取认证子密钥的 keygrip。
1 | # 记录下认证子密钥的 keygrip |
列出 SSH 格式的 GPG 认证密钥的公钥
1 | # 下面命令会列出 GPG 认证密钥的公钥 |
把列出的公钥,放到服务器上的文件 ~/.ssh/authorized_keys 里,就能通过 GPG 来使用 SSH 登录远程主机了。
测试
运行如下命令测试是否能成功登入远程主机:
1 | ssh -p port username@remote_ip |