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

推荐订阅源

Simon Willison's Weblog
Simon Willison's Weblog
T
Threatpost
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Spread Privacy
Spread Privacy
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Engineering at Meta
Engineering at Meta
T
Tenable Blog
C
Cisco Blogs
T
The Blog of Author Tim Ferriss
NISL@THU
NISL@THU
T
Threat Research - Cisco Blogs
T
The Exploit Database - CXSecurity.com
P
Privacy & Cybersecurity Law Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
S
Secure Thoughts
N
News and Events Feed by Topic
Google DeepMind News
Google DeepMind News
博客园 - 三生石上(FineUI控件)
Microsoft Azure Blog
Microsoft Azure Blog
月光博客
月光博客
H
Hacker News: Front Page
I
InfoQ
L
LangChain Blog
Security Latest
Security Latest
The Cloudflare Blog
Forbes - Security
Forbes - Security
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Stack Overflow Blog
Stack Overflow Blog
TaoSecurity Blog
TaoSecurity Blog
量子位
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
V
Visual Studio Blog
Scott Helme
Scott Helme
爱范儿
爱范儿
A
Arctic Wolf
F
Full Disclosure
酷 壳 – CoolShell
酷 壳 – CoolShell
Schneier on Security
Schneier on Security
N
News and Events Feed by Topic
C
CXSECURITY Database RSS Feed - CXSecurity.com
L
LINUX DO - 最新话题
V2EX - 技术
V2EX - 技术
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
人人都是产品经理
人人都是产品经理
The Hacker News
The Hacker News
Hugging Face - Blog
Hugging Face - Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
Know Your Adversary
Know Your Adversary
Application and Cybersecurity Blog
Application and Cybersecurity Blog

See you soon

哟,好久不见,无线打印 | See you soon 试试将文章版本化管理吧 | See you soon 使用 Quadlet 将 Podman 中的 Postgres 当作 systemd 服务运行 | See you soon 大他者,那个无时无刻都在盯着你的东西 | See you soon Laws of Software Engineering,软件工程定律 | See you soon 浅记多因素身份认证 | See you soon Linux 内核中的度量单位 | See you soon 重置 GPG 智能密钥 | See you soon 向 NAS 引入 samba | See you soon 无法重复键入的 Fcitx5 | See you soon ZFS 降级事故 | See you soon 记被 XanMod Kernel 和 AppArmor 联合坑的一次踩坑 | See you soon agent 的 skill 与 toolcall | See you soon 记一次服务器被挂恶意挖矿二进制 | See you soon 活着的 Arc | See you soon 令 acme.sh 使用 Cloudflare 的 DNS API 签发与续签证书 | See you soon 于 Tokio 中卸载 CPU Bound 任务 | See you soon 如我所见,梦破碎的时候 | See you soon 74LS 家族手册 | See you soon JDK Projects 备忘录 | See you soon 关于历史 | See you soon 用 curl 下载 OnePlus 的 ROM | See you soon 实用命令切片 | See you soon 再见,Oh My Zsh。 | See you soon 你不应该复用 strings.Builder | See you soon 博客的明日 | See you soon 被 AppArmor 击杀的 Dockge | See you soon AI 时代的自我 | See you soon 支持删除的布隆过滤器 | See you soon 基于栈的虚拟机与基于寄存器的虚拟机 | See you soon RVA23 包含了什么 | See you soon Rust 的边界检查是否已经有很大的进步 | See you soon 使用 Rust 编写操作系统:Barebones | See you soon 使用 Rust 编写操作系统:引言 | See you soon 编译器笔记:rope | See you soon 编译器笔记:CST | See you soon Paradoxical 札记 | See you soon 简单的相似去重算法(基于向量) | See you soon 更加现代的 PaperMC Minecraft 插件设计指南 | See you soon 简单的 CFG 语法分析方法 | See you soon 简单地使用 Caddy 实现 CORS 配置 | See you soon 让 OpenCV 可以被静态链接 | See you soon 图片搜索笔笺 | See you soon 电路板设计笔记-保护 | See you soon 使用 Rust 实现 SnowflakeId | See you soon 农夫乐事 FaQ 启示 | See you soon 使用 Rust 实现拓展系统札记 | See you soon 遗传学定律的代码实现 | See you soon EN:The Journey of Rust and Procps | See you soon ZH:Rust 与 Procps 之旅 | See you soon 使用 debootstrap 与 schroot 构建一个纯净环境 | See you soon GPG添加新的用户信息 | See you soon GSoC2024 笔记:使用 Rust 重新实现 procps | See you soon JWT 小册 | See you soon 使用密钥登录 SSH | See you soon Guava:Cache | See you soon 编译器笔记:增量编译 | See you soon Gradle秘境:添加一个类似modCompileOnly的依赖块 | See you soon Minecraft:原始经济系统设计简述 | See you soon TinyRemapper笔记 | See you soon MicroOS:进阶 | See you soon MicroOS:起步 | See you soon Swapfile 指北 | See you soon 用GPG签名告诉大家这就是我的提交 | See you soon DFS:深度优先搜索 | See you soon 文章翻译:从init.vim到init.lua | See you soon 目录遍历攻击 | See you soon 如何挂载.img文件,以及如何使用QEMU模拟arm64环境 | See you soon 在树莓派上编译 OpenCV | See you soon 关于卸载BlueStacks后遇到的问题 | See you soon
GPG 物理密钥的安装与密钥的迁移 | See you soon
Krysztal Huang · 2022-06-22 · via See you soon

自从买到了心心念念的偶尔才有货的 CanoKey 后就想着怎么发挥我能用到的它的所有功能,配置好一些网站的 2FA 后就咸鱼了。

然后我发现他可以保存 OpenPGP 密钥,作为 GPG 的物理密钥。

前置要求

  • 需要一个 OpenPGP 支持的 Smartcard,比如 CanoKey,Yubikey。由于 Yubikey 价格过高,我选择的是开源平替 CanoKey
  • 提前安装好 Gpg4Win 之类的 OpenPGP 工具。当然你也可以使用 Git 内自带的 GPG
  • 能识别你的硬件的电脑或者硬件(

思路

我们需要做以下事情:

  • 初始化硬件
  • 生成子密钥
  • 备份主密钥

初始化 Smartcard(后文称之为物理密钥)

经过如下步骤处理可以获得初始化完毕的物理密钥,当然敏感信息也会脱敏。

获取是否能正确识别到物理密钥

$ gpg --card-edit

Reader ...........: canokeys.org OpenPGP PIV OATH 0

Application ID ...: ******

Application type .: OpenPGP

Version ..........: 3.4

Manufacturer .....: unknown

Serial number ....: ******

Name of cardholder: [not set]

Language prefs ...: [not set]

Salutation .......:

URL of public key : [not set]

Login data .......: [not set]

Signature PIN ....: forced

Key attributes ...: rsa2048 rsa2048 rsa2048

Max. PIN lengths .: 64 64 64

PIN retry counter : 3 3 3

Signature counter : 0

Signature key ....: [none]

Encryption key....: [none]

Authentication key: [none]

General key info..: [none]

gpg/card>

如果你的输出和我的差别不大,那么意味着你的物理密钥已经被系统识别到了。

初始化你的物理密钥

这一步推荐阅读 Debian Wiki - Smartcards OpenPGP#Initialise the smartcard

简而言之,你需要设置你的物理密钥的

  • 用户名
  • 语言
  • Reset Code
  • Admin PIN
  • PIN

生成主密钥

由此可知,你需要先生成主密钥。这一步推荐根据 Debian Wiki - Creating a new GPG key 做。

当你完成了生成主密钥,那么你接下来需要生成子密钥,而主密钥必须要离开你的设备进行保存。

生成子密钥

你需要生成三个子密钥,分别是认证(C),签名(S),加密(E)。

输入以下命令开始创建三个子密钥

$ gpg --edit-key --expert [Your Key ID]

******

gpg> addkey

Key is protected.

...

> 选 RSA (sign only)。

******

gpg> addkey

> 选RSA (encrypt only).

******

gpg> addkey

> 选RSA (set your own capabilities)

> 选中 S 和 E 去选掉他们,然后选中 A

******

gpg> save

子密钥生成后,我们需要做两件很重要的事情——生成吊销证书,搬家密钥到安全的地方。

生成吊销证书

当你的主密钥泄漏的时候,你需要吊销你的主密钥,这个时候吊销证书就会派上用场了。

gpg --output revoke.asc --gen-revoke <Your Key ID>

这个证书需要妥善保管,不然任何摸到他的人都能让你的密钥失效。

备份你的所有密钥

你的密钥应当全部拥有备份,备份或许可以打印出来,或许可以放到离线储存介质上。

总之备份应当足够的安全离线,要是你想可以让安保机构帮你保管。

gpg --armor --output privkey.sec --export-secret-key <Your Key ID>

gpg --armor --output subkeys.sec --export-secret-subkeys <Your Key ID>

gpg --armor --output pubkey.asc --export <Your Key ID>

导出的私钥与公钥应当妥善保管,你的保存介质应当得到妥善保管,包括你的吊销证书。

也就是说你需要备份以下四个东西。保护好他们

  • revoke.asc
  • privkey.sec
  • subkeys.sec
  • pubkey.asc (可以选择不备份他,因为他是公钥)

让主密钥离线

在完成以上内容后,你应当命令你的主密钥离线。如果你有另外一个物理密钥的话(下文称之为第二物理密钥),你可以选择把你的主密钥传到第二物理密钥,然后把他妥善的保存好。如果你没有第二物理密钥的话,那么也无所谓,把上面导出的内容放到离线介质也是好的。

再次重复强调,这张第二物理密钥和保存密钥的介质应当长期离线,就算需要使用也应该在纯洁环境中使用。

用第二物理密钥

简单说就是把当前的主密钥传输到一张智能硬件上。

gpg --expert --edit-key <Your Key ID>

gpg> toggle

gpg> keytocard

gpg> save

然后这张物理密钥就变成了保存你的主密钥的物理密钥,这张第二物理密钥应当平常不被使用,只有你需要再次签发新子密钥、更换密钥、注销子密钥的时候才使用。

本地离线主密钥

只要我删掉主密钥不就行了吗?只要我导入只有子密钥的密钥不就行了吗?

gpg --delete-secret-keys [Your Key ID]

然后再次输入gpg -K,如果他没什么输出那就对了。

我们再导入上文导出的subkeys.sec就行了。

让我们再次输入gpg -K,如果你看到一个sec#那就证明做的很正确,主密钥成功离线。

把子密钥搬家到物理硬件

输入以下命令进入编辑密钥模式

gpg --expert --edit-key <Your Key ID>

然后把前面三个子密钥都搬家到物理密钥上

gpg> key [Sub Key ID]

gpg> keytocard

> 重复选中全部三个,并且都 keytocard

gpg> save

在完成以上步骤后,是否我们就结束了?

并不是,我们还需要导出一个stub.asc。这个文件并没有实质内容,他告诉 GPG 需要从物理密钥里面寻找所需要的密钥。

gpg --armor --output stubs.asc --export-secret-keys <Your Key ID>

这个密钥可以随着你的常用介质走,导入到你需要的电脑上,他是安全的,因为不包含任何实际上的私钥。

同样的,推荐你把pubkey.ascstub.asc放在一起。关于为什么下文会提到

上传公钥

你可以选择不做这步,因为上传公钥就能让全世界都能鉴定这是你。如果你是自己用的话就无所谓。

考虑到大多数情况下需要公开公钥,毕竟叫做 PubKey,所以推荐你做这一步。

现在的 KeyServer 会互相同步 Key,因此只需要简单的使用如下命令便可做到全世界的 KeyServer 都有你的 PubKey。

通过以下命令查看主密钥的 KeyID:

gpg --list-keys --keyid-format 0xlong

然后记住主密钥的 KeyID,接下来要用到:

gpg --keyserver keyserver.ubuntu.com --send-key [Your Key ID]

目前的 GPG KeyServer 默认为 keyserver.ubuntu.com ,是国内可以访问的,请放心食用捏。

发现不知道什么时候不是了,因此还是添加了 --keyserver 参数

上文提到的pubkey.asc为什么要和你的stub.asc放一起?因为一旦到了新设备,很可能新设备没联网,GPG 无法校验是否正确。

两个一起导入后 GPG 就能相信这是你了。

如果能联网哪?如果能联网,能与 KeyServer 通讯,并且已经上传了公钥,那么只需要做下面这一步

gpg gpg --keyserver keyserver.ubuntu.com --receive-key [Your Key ID]

大功告成 uwu

参考文献