0%

使用 GPG 密钥登录 SSH

简介

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 密钥的方法详见:

  1. 生成主密钥
  2. 生成认证密钥等子密钥

生成属于自己的一对密钥后,再向这个密钥中添加一个认证密钥[A]。

最后,密钥看起来像下面这样。[A] 子密钥用于认证,即用于 SSH 登录:

1
2
3
4
5
6
7
$ gpg --list-key 0AAABBCCDDDDDDDDDDDDDDDDFFFFFFFXXXXXXXXZ
pub rsa4096 2019-XX-XX [C] [有效至:20XX-XX-XX]
0AAABBCCDDDDDDDDDDDDDDDDFFFFFFFXXXXXXXXZ
uid [ 绝对 ] Jason <example@example.com>
sub rsa4096 2019-01-15 [E]
sub rsa4096 2019-01-15 [A]
sub rsa4096 2019-01-15 [S]

设置用于 SSH 登录

配置 gpg-agent 选项

1
2
3
4
5
6
7
8
9
10
11
vim ~/.gnupg/gpg-agent.conf

# 加入下面三行
# 三行分别表示
# 输入一次 GPG 密码后,600 秒内不用重复输入,600 秒内再次使用密码会重置这个时间
# 从首次输入密码算起,不管最近一次使用密码是什么时间,只要最大 TTL 过期,就需要重新输入密码
# 启用 SSH 支持

default-cache-ttl 600
max-cache-ttl 7200
enable-ssh-support

修改 .bashrc 文件

让 ssh 与 gpg-agent 通信,而不是 ssh-agent。

1
2
3
# 在 .bashrc 文件末尾添加如下一行

export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)

为了使更改生效,运行如下命令:

1
2
killall gpg-agent
bash

获取认证密钥的 keygrip

为了告诉 gpg-agent 应该使用哪个认证子密钥,需要先获取认证子密钥的 keygrip。

1
2
3
4
5
6
7
8
9
10
11
12
# 记录下认证子密钥的 keygrip
# 下面的结果中 keygrip 就是
# 0BBBBBBBBBBZZZZZZZZZZZZZZXXXXXXXXZZBBBCC

$ gpg --with-keygrip --list-key 0AAABBCCDDDDDDDDDDDDDDDDFFFFFFFXXXXXXXXZ
...
sub rsa4096 2019-01-15 [A]
Keygrip = 0BBBBBBBBBBZZZZZZZZZZZZZZXXXXXXXXZZBBBCC
...

# 添加 keygrip
echo 0BBBBBBBBBBZZZZZZZZZZZZZZXXXXXXXXZZBBBCC >> ~/.gnupg/sshcontrol

列出 SSH 格式的 GPG 认证密钥的公钥

1
2
# 下面命令会列出 GPG 认证密钥的公钥
ssh-add -L

把列出的公钥,放到服务器上的文件 ~/.ssh/authorized_keys 里,就能通过 GPG 来使用 SSH 登录远程主机了。

测试

运行如下命令测试是否能成功登入远程主机:

1
ssh -p port username@remote_ip