为 PGP Key 部署 Web Key Directory (WKD) 托管

你现在可以快速地通过我的域名邮箱[email protected]来自动获取我的 PGP 公钥。

1
gpg --locate-key [email protected]

起因

前些日子想把原来的 RSA 公钥全部更换为 ECC 公钥,便重新生成了新的主密钥。

1
2
3
4
5
6
7
8
9
$ gpg --list-keys C4B71F9ED3515AEB8270D5D7189BB387CF3AD95F
pub ed25519 2021-05-15 [C] [expires: 2024-01-01]
C4B71F9ED3515AEB8270D5D7189BB387CF3AD95F
uid [ultimate] 欠陥電気RadioNoise (御坂13514号のECC鍵) <[email protected]>
uid [ultimate] Misaka13514 <[email protected]>
uid [ultimate] Misaka <[email protected]>
sub ed25519 2021-05-16 [S] [expires: 2024-01-01]
sub ed25519 2021-05-16 [A] [expires: 2024-01-01]
sub cv25519 2021-05-16 [E] [expires: 2024-01-01]

生成完就需要发布公钥供他人交换。以前我使用的是公钥服务器+在网页或其它平台发布公钥的下载链接或是公钥指纹的最后几位。

假设有一个人只有我的邮箱信息而想要给我发送加密邮件,一般来说有这些交换方法,它们似乎仍不够快速或是不够安全。

  • 面对面交换显然太繁琐了。
  • gpg --recv-keys只能通过指纹从公钥服务器获取公钥。使用这个命令需要先通过其它途径知道正确的指纹。
  • 如果发布到 Web 或是 代码仓库 ,需要先在网页上查找到对应 URL 并下载。
  • 看见有人使用特殊方法生成了带有靓号指纹的密钥。碰撞出相同一部分指纹的密钥是有可能做到的。
    (建议公开至少 64bit (16 位 16 进制)的指纹)
  • gpg --search-keys可以通过邮箱在公钥服务器搜索与下载。但公钥服务器接受任何人上传的公钥,任何人可以生成含有我的邮箱标识的密钥并发布。
    (现在如keys.openpgp.org等服务器会在上传公钥后向对应邮箱发送验证邮件来验证身份)

正如 IPv6 与 DNS 那样,有一个靓号不如配置了方便有效的交换方式。

于是我寻找了其他发布公钥的途径,有DNS CERTDANEWeb Key Directory (wkd)LDAPNTDS等。关于这些方法的说明可以man gpg或是在GPG 文档中看到。

我选择了Web Key Directory (wkd)方法,它也是默认启用的除本地外的唯一一种方法。下面将以我的密钥为例,自己部署 WKD。你也可以使用在自己域名上使用第三方提供的服务。如果你使用的邮箱的域名已经提供了这样的服务,你可以跳过下面的步骤。

自己部署

条件

  • 有可以修改记录的域名
    需要修改 apex 顶级域名或是 openpgpkey 子域名记录
  • 使用该域名邮箱
  • 有可使用的网页服务器或可信的第三方托管服务
  • GPG 版本 >= 2.2.12 (或自行查看官方文档中的其他可用客户端)

创建 WKD 文件夹

创建一个文件夹,并作为openpgpkey.your.domain的站点根目录。然后创建 WKD 的目录结构。

下面的部分命令需要根据你的情况来修改。

1
2
3
4
5
6
$ mkdir openpgpkey-WKD && cd openpgpkey-WKD
$ mkdir -p .well-known/openpgpkey
$ cd .well-known
$ gpg --list-options show-only-fpr-mbox -k "@your.domain" | $(gpgconf --list-dirs libexecdir)/gpg-wks-client -v --install-key
#如果需要,也可以替换为指定单个 Key
$ cd ..

输出将会类似这样

1
2
3
4
5
6
7
gpg-wks-client: gpg: Total number processed: 1
gpg-wks-client: using key with user id 'Misaka <[email protected]>'
gpg-wks-client: gpg: Total number processed: 1
gpg-wks-client: directory 'openpgpkey/apeiria.net' created
gpg-wks-client: directory 'openpgpkey/apeiria.net/hu' created
gpg-wks-client: policy file 'openpgpkey/apeiria.net/policy' created
gpg-wks-client: key C4B71F9ED3515AEB8270D5D7189BB387CF3AD95F published for '[email protected]'

站点目录结构将会类似这样

1
2
3
4
5
6
7
$ tree -a
.
`-- openpgpkey
`-- apeiria.net
|-- hu
| `-- 4y36rkzdjnzmk3oxaekyi5biowgr5kcz
`-- policy

在 GitHub Pages 上发布

你也可以使用其它任何你喜爱的 Web 托管方式。

在 GitHub 上创建一个公开仓库。

GitHub Pages 默认启用了 Jekyll,而它默认不会构建开头为.的文件夹,所以需要额外的配置。

可以通过在根目录创建.nojekyll文件以直接禁用 Jekyll;也可以创建一个配置文件_config.yml,并写入include: [".well-known"]

1
2
3
4
5
6
7
8
9
10
11
$ touch .nojekyll
$ echo "openpgpkey.your.domain" > CNAME
$ git init && git add . && git commit -m "Initial commit"
Initialized empty Git repository in ~/openpgpkey-WKD/.git/
[main (root-commit) 114514 ] Initial commit
3 files changed, 3 insertions(+)
create mode 100644 .well-known/openpgpkey/your.domain/hu/1145141919810aaaaaa
create mode 100644 .well-known/openpgpkey/your.domain/policy
create mode 100644 CNAME
$ git remote add origin your-url
$ git push -u origin your-branch-name

将域名记录按照 GitHub 文档指向 GitHub Pages,然后到 GitHub 上启用 GitHub Pages,可以访问对应 URL 查看是否生效。

使用第三方服务

部分网站如keys.openpgp.org提供了 WKD as a Service 的服务。

在网站上上传自己的公钥后,就可以使用它提供的服务了。

只需添加这样一条CNAME记录:将openpgpkey.your.domain指向wkd.keys.openpgp.org

测试

1
2
3
4
5
6
7
8
9
10
11
$ gpg --no-default-keyring --keyring /tmp/gpg-$$ \
--auto-key-locate clear,wkd,nodefault --verbose --locate-key [email protected]
gpg: key 189BB387CF3AD95F: public key "Misaka <[email protected]>" imported
gpg: Total number processed: 1
gpg: imported: 1
pub ed25519 2021-05-15 [C] [expires: 2024-01-01]
C4B71F9ED3515AEB8270D5D7189BB387CF3AD95F
uid [ unknown] Misaka <[email protected]>
sub ed25519 2021-05-16 [S] [expires: 2024-01-01]
sub ed25519 2021-05-16 [A] [expires: 2024-01-01]
sub cv25519 2021-05-16 [E] [expires: 2024-01-01]

推荐阅读

2021 年,用更现代的方法使用 PGP by UlyC

  1. PGP 基础
  2. 安全使用
  3. 公钥的发布与交换

参考

  • Web Key Directory
  • Hosting a Web Key Directory (without dynamic WKS)
  • Hosting a Web Key Directory
  • Hosting a Web Key Directory on GitHub Pages
  • GPG Configuration Options