惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Threatpost
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Engineering at Meta
Engineering at Meta
T
The Blog of Author Tim Ferriss
Recent Announcements
Recent Announcements
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
The Register - Security
The Register - Security
MongoDB | Blog
MongoDB | Blog
U
Unit 42
B
Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
L
LangChain Blog
Stack Overflow Blog
Stack Overflow Blog
P
Privacy International News Feed
L
LINUX DO - 最新话题
博客园_首页
博客园 - Franky
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Tor Project blog
V
Visual Studio Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
P
Privacy & Cybersecurity Law Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
K
Kaspersky official blog
C
Cisco Blogs
博客园 - 【当耐特】
阮一峰的网络日志
阮一峰的网络日志
I
Intezer
罗磊的独立博客
MyScale Blog
MyScale Blog
Last Week in AI
Last Week in AI
A
About on SuperTechFans
G
GRAHAM CLULEY
Y
Y Combinator Blog
Microsoft Security Blog
Microsoft Security Blog
GbyAI
GbyAI
T
Threat Research - Cisco Blogs
P
Proofpoint News Feed
D
DataBreaches.Net
The Hacker News
The Hacker News
Spread Privacy
Spread Privacy
AWS News Blog
AWS News Blog
I
InfoQ
T
The Exploit Database - CXSecurity.com
Simon Willison's Weblog
Simon Willison's Weblog
博客园 - 叶小钗
Project Zero
Project Zero

Liups233の小站

YubiKey OpenPGP 智能卡使用指南 - Liups233の小站 OpenLiteSpeed 安装与建站配置 详细教程 - Liups233 使用 DNSCrypt-Proxy 为 Linux 配置加密 DNS - Liups233 WordPress 7.0 编辑器改回无衬线字体 - Liups233の小站 Redis 数据库权限与 Unix Socket 配置 - Liups233の小站 Cloudflare 设置 mTLS 验证来源拉取 - Liups233の小站 Docker 自建 RustDesk 远程和 API 服务 - Liups233の小站 ChatGPT Go 印度区免费试用白嫖 1 年 - Liups233の小站 使用 S/MIME 证书签名并加密电子邮件 - Liups233の小站 为 WordPress 外发邮件添加 S/MIME 签名 - Liups233の小站 网站域名变更迁移教程/记录 - Liups233の小站 将动漫视频刻录为视频光盘-蓝光/AVCHD DVD - Liups233の小站 百乐 CUSTOM 912 钢笔使用体验 - Liups233の小站 使用 Cloudflare mTLS 用户端凭证保护博客登入页面 - Liups233の小站 Kobo 手动安装 NickelMenu 和 KOReader - Liups233の小站 Kobo 阅读器字典缺字解决 - Liups233の小站 iCloud+ 域名邮箱的注册和使用 - Liups233の小站 9 美元一年的通配符 SSL 证书 - Liups233の小站 宝塔面板 Nginx 启用 Brotli 和 Pagespeed - Liups233の小站 拷贝 DVD/Blu-ray 光盘并使用 MeGUI 压制 - Liups233の小站 Spotify 相较 Apple Music 的优点 - Liups233の小站 欧卡/美卡自定义手排挡位布局 - Liups233の小站 内地居民到港开户汇丰和中银香港全过程 - Liups233の小站 给光驱刷入 LibreDrive 固件解锁区域和加密限制 - Liups233の小站 个人博客适用的 Cloudflare 防火墙和缓存规则 - Liups233の小站 为Kobo阅读器添加Google Drive和Dropbox功能 - Liups233の小站 百乐 PILOT Capless Fermo 钢笔评测 - Liups233の小站 业余无线电 B 类考试笔记 - Liups233の小站 黑白阅读器的绝唱?Kobo Clara BW 简单评测 - Liups233の小站 八重洲 WIRES-X 网络注册与使用教程 - Liups233の小站 异世的同路人 — 恋语 Juliamo 游戏简评 - Liups233の小站 欢迎加入我的 FreeDMR 服务器 - Liups233の小站 低至 6 港币一年的 Club SIM eSIM 保号卡 - Liups233の小站 H310/H710(P)/H810 阵列卡刷写为直通模式 - Liups233の小站
通过 WKD / OPENPGPKEY DNS 记录部署 GPG 公钥 - Liups233の小站
Liups233 · 2026-06-14 · via Liups233の小站

前言

如果你基本了解 OpenPGP,就知道只要将公钥上传到密钥服务器,就可以供他人搜索和下载。但除此之外,还有其它更去中心化的方式,可以作为传统密钥服务器的补充或替代。本文会讲述如何配置额外的公钥分发机制:WKD(Web Key Directory)和 OPENPGPKEY DNS 记录。

关于 WKD 是什么,可见 WKD – GnuPG wiki
关于 OPENPGPKEY DNS 记录,可见 RFC 7929 文档。

封面图来自 The GNU Privacy Guard

目录

先决条件

  • 已有一个可用的 OpenPGP 密钥,且用户 ID 包含域名邮箱。
  • 有 GPG 命令行、GitHub、Git 的使用经验,并且已经知道如何将文件 Push 到 GitHub。
  • 必须使用域名邮箱,不能使用公共邮箱,并对域名 DNS 记录有完全控制权。
  • 如果要配置 WKD,需要一个网页服务器或静态内容托管服务,本文会使用免费的 Cloudflare Pages 演示。
  • 如果要配置 OPENPGPKEY DNS 记录,需要将域名托管至支持该记录的权威 DNS 服务商,如 Cloudflare,并且启用 DNSSEC。如果公钥特别长(例如 RSA 4096),可能放不上去。
  • 所有命令均在 Linux 上测试过,Windows 用户可能需要安装额外软件或使用虚拟机。

OpenPGP WKD

使用命令 gpg-wks-client --print-wkd-url <邮箱> 可以查看 GPG 会使用什么链接来尝试从 WKD 获取公钥。可以看到,我们需要创建一个 openpgpkey 子域名,然后在 .well-known 文件夹里放置公钥。

GPG 查看 WKD URL
GPG 查看 WKD URL

我的思路如下:创建一个 GitHub Repo,将 .well-known 文件夹放进这个 Repo 里,然后用这个 Repo 创建一个 Cloudflare Pages,再给这个 Pages 绑定 openpgpkey 子域名即可(还需要在 WAF 里新建规则,跳过这个域名)。GitHub Repo 长啥样可以看我这个 示例,以下是具体步骤。

创建 GitHub 库

打开 GitHub,创建一个 Repo,命名随意。我这里以 website-well-known 为例,Visibility 用 Public 和 Private 应该都行,毕竟也不是什么敏感信息。

创建 Repo
创建 Repo

创建文件夹,用来存放 .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 main

Push 后,回到 GitHub,刷新页面,有东西即可。

如果你不打算使用 GitHub 和 Cloudflare Pages,可以创建一个新的虚拟主机,分配 openpgpkey 的子域名,配置 SSL,然后直接将 .well-known 复制到虚拟主机根目录下即可。

Cloudflare Pages

登入 Cloudflare 仪表板,在左侧工具栏找到 Workers 和 Pages,然后点击右上角的 建立,再点击下方的小字来部署 Pages(不需要 Workers),然后选择从现有 Git 库导入。

Cloudflare 从 Git 创建 Pages
Cloudflare 从 Git 创建 Pages

到下一个页面,需要绑定你的 GitHub 帐号,然后选择刚才创建的 website-well-known 库,然后下一步。

到下一个页面,只需要设置名称,其它都不要设置,然后点击 储存和部署。等待它从 GitHub 获取文件并部署后,点击继续。

然后点击上方工具栏,自定义一个域名,域名填写 openpgpkey.example.com(example.com 换成你的一级域名),然后下一步确认即可。

Pages 自定义域名
Pages 自定义域名

之后尝试用浏览器访问命令 gpg-wks-client --print-wkd-url <邮箱> 生成的链接,如果有东西下载下来就没问题了,然后需要配置 Cloudflare WAF。

Cloudflare WAF

回到 仪表板,点进你的域名,然后在左侧找到 WAF,再点击 自订规则,然后创建一个新规则:

Cloudflare WAF 自订规则
Cloudflare WAF 自订规则

当传入要求符合:

  • 主机名称 等于 openpgpkey.example.com(换成你的域名)

动作:跳过

要跳过的 WAF 元件,勾选:

  • 所有剩余的自订规则
  • 所有 Super Bot Fight 模式规则

放置位置看你情况,建议放在直接封禁的规则后,跳验证码的规则前,然后保存。

修改回应标头 Content-Type

为了符合规范,我们需要修改 WKD 公钥回应标头中的 Content-Type。回到 Cloudflare 仪表板,点击左侧的 规则>概观,然后往下找到 回应标头转换规则,点击添加:

添加回应标头转换规则
添加回应标头转换规则

名称:自订

当传入要求符合:

  • URI 包含 .well-known/openpgpkey/example.com/hu(example.com 换成你的一级域名)

则:

  • 设定静态 Content-Type = application/octet-stream
设置 Content-Type
设置 Content-Type

规则放置的位置无所谓,然后保存即可。

测试

接下来,输入以下命令来尝试通过 WKD 获取公钥(命令会避免读取本机已有的密钥,而只从 WKD 获取),能获取到密钥就说明没问题了:

gpg --no-default-keyring --keyring /tmp/gpg-$(uuidgen) --auto-key-locate clear,wkd --locate-keys <邮箱>
GPG 通过 WKD 获取公钥
GPG 通过 WKD 获取公钥

获取 DNS 记录内容

首先需要安装 hash-sligner 这个包,可以方便地生成相关 DNS 记录,然后执行 openpgpkey --create <邮箱>,就可以产生记录,如图:

产生的 OPENPGPKEY DNS 记录
产生的 OPENPGPKEY DNS 记录

注意,产生的结果实际上只有两行,第一行是密钥 ID(图中是 ; keyid: A5E438CF9CF9A6D9),第二行是 DNS 记录内容(剩余的其它内容):

  • 第二行的第一部分是记录的名称(图中是 8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2a._openpgpkey.liups.net.
  • 第二行的第二部分指明了 DNS 记录的类型(IN OPENPGPKEY,也就是 OPENPGPKEY 类型)
  • 第二行的第三部分(红框)是记录的内容(公钥内容)

由于终端可能有区别,有的复制出来不会是一行内容,建议你用 openpgpkey --create <邮箱> | tee record.txt 命令,直接将记录内容保存为文本文件,然后用你桌面环境的文本编辑器打开来复制,这样大概率是正确的。

用 Kate 编辑器打开文本
用 Kate 编辑器打开文本,可以看到 DNS 记录内容都在一行里

添加记录

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

  • 类型:OPENPGPKEY
  • 名称:第二行第一部分内容
  • 公开金钥:第二行第三部分(红框)内容
添加 DNS 记录
添加 DNS 记录

测试

通过以下命令可以尝试从 DNS 记录获取,能获取到东西就行:

gpg --no-default-keyring --keyring /tmp/gpg-$(uuidgen) --auto-key-locate clear,dane --locate-keys <邮箱>

但是,如果域名没有启用 DNSSEC,或是你使用的 DNS 服务器不支持 DNSSEC,那么这样获取的 DNS 记录是有可能被篡改的。

大概内容就这样了,其它内容欢迎到我 主页 去看,我的 OpenPGP 密钥可以见 此页面

参考资料