最近看到了开源物理安全密钥方案 Pico Keys FIDO 2,可以在一块树莓派 Pico (RP 2350) 上面存储 Passkey,甚至 OpenPGP 密钥。

于是火速买了块华强北国产 RP 2350 树莓派,很快就到货了啊,就是下面的这个:

RP2350-Plus WaveShare

注:如果你是来看 PicoKey OpenPGP 踩坑的,你大可以略过前面内容,去看省流。

刷点固件

Pico-FIDO 2 支持同时保存 Passkey TOTP 和 OpenGPG 密钥。要开始使用这块开发板,我们必须先刷入固件。

按住 BOOT 按钮,然后插入数据线到电脑(别松手),你就会看到一个额外的存储器,允许我们把固件刷入。

你得先根据你的设备型号(开发商一般标注在板子上),然后下载对应固件。去上面 Github Release 里面下(Latest 的管理面板密钥有 Bug 而且型号不全,建议 Nightly,如果仍然有 Bug 你可以一路降级刷入)。

下载的 .uf2 固件复制到那个存储器里面,然后拔掉重新插入开机。非常好!你已经获得了一个暂时不能用的物理安全密钥!

初始化

要使用这个密钥,是时候初始化你的密钥了!

打开 Pico Commissioner,Vendor 选 Yubikey 4/5 然后勾上 LED dimmable(自动灭灯防止闪瞎狗眼),Initialize(自动清除所有已经保存的密钥),Product Name 填 yubico yubikey必须完全一致!否则之后管理应用程序会报错

然后 Commission via WebAuthn,弹出窗口选择更改位置,选择安全密钥:

选择位置

如果你是第一次初始化,那么会要求你设置一个密码 PIN,否则会先提示你输入旧的密码。根据提示按一下互动按钮(是 BOOT 按钮,不是 Reset)。

保存后插拔一下你的密钥,现在你的密钥已经可以用于 Passkey 了!去任何支持的网站添加,然后选择保存到安全密钥,即可使用。

管理你的安全密钥

还记得吗?我们上面把密钥命名为了yubico yubikey,这是为了模拟成一个 Yubikey,这样就能用 Yubico Authenticator 来管理你的密钥了。你搜一搜就能在官网上找到这个 APP,安装好运行就行了。打开之后输入密码提权一下就能看到 Passkey 密钥了。

管理通行密钥

OpenPGP

嗯,实际上前面都是简写,我踩坑最大的还是 gpg 命令行的问题。

我们可以把 gpg 密钥移动到 Pico 上面,作为 OpenPGP 智能卡来用。这样的话,不仅可以在多个电脑上使用,也更加安全,因为密钥不能提取和复制。

首先,请记住下面几个血的教训(省流提示)

  • 进行任何迁移到卡的操作,都是不可逆的,请务必在操作前进行备份。
  • Yubico App 打开时候,gpg 命令行会 Card Error,无法读取这个智能卡,所以请先关闭再操作
  • Yubico App 里面的 PIV 管理和 gpg 命令行是分开的,改了一个密码和另外一个无关(非 Nightly 固件还有 Bug,密码改不了,重置后无法获得管理密钥等神奇状况……)
  • 默认的 PIN 123456,默认的 Admin PIN 12345678
  • 默认 PIN 不改掉,gpg 是用不了的
  • Admin PIN 不能太短,也不要和 PIN 重复

备份你的密钥

好的,如果你是小白,那么上面省流你也看不懂,跟着我操作吧。

首先我们假设你已经有 OpenPGP 的主密钥和子密钥了,如果没有请自行生成。

然后我们先备份一下,防止被干掉。

1
gpg --list-secret-keys

这个命令可以看到你有哪些 Key。

示例输出(我已经把子密钥移动到了 Pico,你的输出应该会告诉你子密钥的 ID):

1
2
3
4
5
6
7
8
C:\Users\samho>gpg --list-secret-keys
[keyboxd]
---------
sec rsa3072 2025-07-07 [SC]
B9XXXXXXXXXXXX
uid [ultimate] Sam Hou <sam@samhou.top>
ssb> rsa3072 2025-07-07 [E]
ssb> rsa3072 2025-11-09 [S]

然后导出主密钥和子密钥备份到本地文件:

1
2
gpg --export-secret-keys --armor [ID] > masterkey.asc
gpg --export-secret-subkeys --armor [ID] > subkeys.asc

把 ID 改成你上面提示的 ID(两个都是主密钥的!)

按照提示输入密码解锁,然后把生成的文件,保存到一个离线的硬盘里面,确保安全。

初始化智能卡

你必须先初始化你的 Key,才能迁移密钥并使用。

请注意,这一步是必须的,不能跳过改密码。

插入你的 Pico,然后输入:

1
gpg --card-edit

这个命令会进入智能卡编辑状态。

输入 admin 进入管理模式。

然后输入 passwd 修改默认 PIN,选择 1。

输入 PIN 123456,然后再设置你的新的 PIN。

改密码

然后输入 3,修改 Admin PIN。输入 12345678 解锁,然后改一个自己喜欢的。注意别太短,也别重复,会报错。

然后 Q 退出,输入 quit 退出命令行,卡初始化完成。

迁移密钥

初始化之后我们就能用卡了。

首先进入密钥编辑模式:

1
gpg --edit-key [ID]

你的 ID 就是主密钥的 ID。进入命令行,然后输入 key 1/2(不要输入 0,把主密钥保存在卡里面是不推荐的,选一个子密钥),选中之后,输入 keytocard

提示选择密钥槽位,会根据你的密钥类型自动匹配。选择你想要的(槽位一共有三个,分别是签名加密认证

自动选择

然后根据提示输入密码就行了。

迁移完你的密钥之后,输入 save 保存退出命令行。此时,你的密钥已经不在本地了,保存到了你的 Pico 上面,非常安全。

测试密钥

我们来签名下试试:

解锁卡

输入 PIN,成功!

这下你就能用 gpg 了,当然 git 提交签名什么的都不是问题了。

在其它电脑上使用

由于智能卡只存储私钥,所以要让另一台设备也保存你的公钥吗,才能识别。你可以导出再导入:

1
2
gpg --armor --export [ID或邮箱] > publickey.asc
gpg --import publickey.asc

也可以直接发布你的公钥,然后远程下载回来(我没成功,或许是网络问题?):

1
2
gpg --send-keys [ID]
gpg --recv-keys [ID]

当然你也能用 Kleopatra,反正能拿到公钥就行。

接下来插入卡,就能使用啦。