




















如果你基本了解 OpenPGP,就知道只要将公钥上传到密钥服务器,就可以供他人搜索和下载。但除此之外,还有其它更去中心化的方式,可以作为传统密钥服务器的补充或替代。本文会讲述如何配置额外的公钥分发机制:WKD(Web Key Directory)和 OPENPGPKEY DNS 记录。
关于 WKD 是什么,可见 WKD – GnuPG wiki。
关于 OPENPGPKEY DNS 记录,可见 RFC 7929 文档。
封面图来自 The GNU Privacy Guard
使用命令 gpg-wks-client --print-wkd-url <邮箱> 可以查看 GPG 会使用什么链接来尝试从 WKD 获取公钥。可以看到,我们需要创建一个 openpgpkey 子域名,然后在 .well-known 文件夹里放置公钥。

我的思路如下:创建一个 GitHub Repo,将 .well-known 文件夹放进这个 Repo 里,然后用这个 Repo 创建一个 Cloudflare Pages,再给这个 Pages 绑定 openpgpkey 子域名即可(还需要在 WAF 里新建规则,跳过这个域名)。GitHub Repo 长啥样可以看我这个 示例,以下是具体步骤。
打开 GitHub,创建一个 Repo,命名随意。我这里以 website-well-known 为例,Visibility 用 Public 和 Private 应该都行,毕竟也不是什么敏感信息。

创建文件夹,用来存放 .well-known 等文件,位置可自订:
mkdir -p website-well-known/.well-known/openpgpkey
cd website-well-known
gpg --list-options show-only-fpr-mbox -k "<邮件>" | gpg-wks-client -v --directory .well-known/openpgpkey --install-key然后就可以开始 Git 操作了,以下仅示例,请根据你的情况来:
git init
git add .
git commit -m "Upload WKD"
git branch -M main
git remote add origin [email protected]:<用户名>/website-well-known.git
git push -u origin mainPush 后,回到 GitHub,刷新页面,有东西即可。
如果你不打算使用 GitHub 和 Cloudflare Pages,可以创建一个新的虚拟主机,分配 openpgpkey 的子域名,配置 SSL,然后直接将 .well-known 复制到虚拟主机根目录下即可。
登入 Cloudflare 仪表板,在左侧工具栏找到 Workers 和 Pages,然后点击右上角的 建立,再点击下方的小字来部署 Pages(不需要 Workers),然后选择从现有 Git 库导入。

到下一个页面,需要绑定你的 GitHub 帐号,然后选择刚才创建的 website-well-known 库,然后下一步。
到下一个页面,只需要设置名称,其它都不要设置,然后点击 储存和部署。等待它从 GitHub 获取文件并部署后,点击继续。
然后点击上方工具栏,自定义一个域名,域名填写 openpgpkey.example.com(example.com 换成你的一级域名),然后下一步确认即可。

之后尝试用浏览器访问命令 gpg-wks-client --print-wkd-url <邮箱> 生成的链接,如果有东西下载下来就没问题了,然后需要配置 Cloudflare WAF。
回到 仪表板,点进你的域名,然后在左侧找到 WAF,再点击 自订规则,然后创建一个新规则:

当传入要求符合:
动作:跳过
要跳过的 WAF 元件,勾选:
放置位置看你情况,建议放在直接封禁的规则后,跳验证码的规则前,然后保存。
为了符合规范,我们需要修改 WKD 公钥回应标头中的 Content-Type。回到 Cloudflare 仪表板,点击左侧的 规则>概观,然后往下找到 回应标头转换规则,点击添加:

名称:自订
当传入要求符合:
则:

规则放置的位置无所谓,然后保存即可。
接下来,输入以下命令来尝试通过 WKD 获取公钥(命令会避免读取本机已有的密钥,而只从 WKD 获取),能获取到密钥就说明没问题了:
gpg --no-default-keyring --keyring /tmp/gpg-$(uuidgen) --auto-key-locate clear,wkd --locate-keys <邮箱>
首先需要安装 hash-sligner 这个包,可以方便地生成相关 DNS 记录,然后执行 openpgpkey --create <邮箱>,就可以产生记录,如图:

注意,产生的结果实际上只有两行,第一行是密钥 ID(图中是 ; keyid: A5E438CF9CF9A6D9),第二行是 DNS 记录内容(剩余的其它内容):
8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2a._openpgpkey.liups.net.)IN OPENPGPKEY,也就是 OPENPGPKEY 类型)由于终端可能有区别,有的复制出来不会是一行内容,建议你用 openpgpkey --create <邮箱> | tee record.txt 命令,直接将记录内容保存为文本文件,然后用你桌面环境的文本编辑器打开来复制,这样大概率是正确的。

回到 Cloudflare 仪表板,点击左侧的 DNS>记录,添加一个 DNS 记录,然后保存:

通过以下命令可以尝试从 DNS 记录获取,能获取到东西就行:
gpg --no-default-keyring --keyring /tmp/gpg-$(uuidgen) --auto-key-locate clear,dane --locate-keys <邮箱>但是,如果域名没有启用 DNSSEC,或是你使用的 DNS 服务器不支持 DNSSEC,那么这样获取的 DNS 记录是有可能被篡改的。
大概内容就这样了,其它内容欢迎到我 主页 去看,我的 OpenPGP 密钥可以见 此页面。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。