使用 Waveshare RP2350-One 制作一个开源版 YubiKey
前言
第一次听说 YubiKey 大约是在十多年前,当时觉得一个硬件的安全密钥“很酷”,但是搜了一下淘宝的售价直接给我劝退了。现在 YubiKey 在淘宝的售价虽然有所降低,但是依然需要 300 多块,不过我们已经有了低成本的开源替代选择:Pico FIDO2。
硬件选择
Pico FIDO2 支持多种硬件,我选择的是微雪(Waveshare)推出的 RP2350-One,这也是网上教程主流的选择,价格约在 30 人民币上下,包邮,非常便宜。
固件与刷机流程
Pico FIDO2 的固件可以到仓库的 Release 上找到,对于本文使用的 Waveshare RP2350-One,我们需要 pico_fido2_waveshare_rp2350_one-x.x.uf2
Waveshare RP2350-One 的刷机流程也非常简单,只需要按住 Boot
键插入电脑,他就会被识别为一个 U 盘,直接把需要刷入的 uf2
固件拖入其中即可完成固件刷写与重启,非常方便,不过为了让 Pico FIDO2 的固件正确刷入(可以使用 Yubico Authenticator 等软件),我们还是需要遵循一定的流程,以下流程参考此文并结合个人实践得出:
- 按住
Boot
,插入电脑 - 把
pico_fido2_waveshare_rp2350_one-x.x.uf2
拖入 RP2350 中,等待一会 - 拔出 RP2350
- 插入 RP2350(这次不要按任何按键)
- 在 Pico Commissioner 调试,选项如下,其中 Product Name 为
Yubico YubiKey
:
调整完选项后,点击 Commission via WebUSB 选择红框的设置直接照搬我的选项即可,这里着重解释一下绿框的两个选项。
对于物理密钥来说,面对物理接触攻击时的安全性很重要。开启 Secure Boot 和 Secure Lock 可以防止未授权的固件运行或访问芯片内的密钥,从而保护设备免受篡改和数据泄露。
但代价是该开发板日后只能运行 Pico Keys 的官方固件,该选择不可逆。
如果你是打算进行二次开发、DIY因此需要自签,那么就不要开启绿框的两个选项。但如果你打算将其作为日常使用的物理密钥,那我强烈建议你打开这两个选项。Pico Key
并连接,然后点击Commission via WebAuthn,并选择写入物理密钥,根据操作系统引导进行配置。 - 拔出,插入,打开 Yubico Authenticator 或 YubiKey Manager,可正常显示。
此处的重点就在于刷写完固件后拔插一次 RP2350,如果不这么干的话虽然固件明面上正常可用,但 Yubico Authenticator 和 YubiKey Manager 无法正常识别 RP2350 为 YubiKey。
如果遇到问题,可以使用 Pico Nuke 清空所有数据再次刷写,具体的操作是在上面的 1 和 2 之间加入一条:
- 把
pico_nuke_waveshare_rp2350_one-1.4.uf2
拖入 RP2350 中,等待其再次作为 U 盘出现。
使用与管理
普通的 YubiKey 所支持的功能,基本上 Pico Key 都支持,但是要注意部分功能(PIV 与 OpenGPG)被作者拆分成了多个部分,不过 Pico FIDO2 固件本身支持 FIDO2 和 OATH,对于大多数人来讲够用了。
对于正确刷写了固件的 Pico Key,你可以直接通过 Yubico Authenticator 进行使用与管理,或者通过命令行工具 ykman
进行使用与管理。有关 ykman
的部分可以直接参考这篇文章,本文选择更加方便的 Yubico Authenticator。
在使用密钥的过程中,经常能看到的一句提示是“触摸密钥”,对于 Pico Key,这里指的是按下 Boot 按键。
OATH
在 Yubico Authenticator 左栏选择“账户”,点击右边的“添加账户”即可添加 TOTP 或 HOTP 的 OATH 到账户中。
不过我大多数使用 OATH 的场景都不太适合用一个物理密钥,个人认为 OATH 的部分使用自建的 Bitwarden 更加可靠和实用。当然,决定选用那种 OATH 方式是根据个人需求决定的,Pico Key 与 Bitwarden 各有各的优劣。
FIDO2
这才是我对物理密钥需求更大的部分。
WebAuth
FIDO2 可以通过 WebAuth 作为无密码登录的 Passkey 或 2FA 的 Second factor。比如对于 Google 账户来说,在 账户设置 - 安全性 - 通行密钥和安全密钥 部分就可以添加各种类型的通行密钥:
此处选择“换部设备”(默认是添加到 Windows Hello)即可将通行密钥添加到 Pico Key 当中:
其他服务商同理,只要提供了 WebAuth 支持的服务商均可使用这种办法将密钥添加到 Pico Key 当中。
SSH
FIDO2 也可以用于 SSH 私钥,只需要生成带硬件校验的密钥对即可:
1 | ssh-keygen -t ed25519-sk |
不过这种方法主要是为传统的密钥对添加上硬件校验,需要硬件和私钥同时存在才能使用。从安全性角度来讲这么做是正确的,但是从使用角度来讲我还是更希望物理密钥本身可以单独使用,或者能够存储私钥。于是我们可以考虑添加 resident
选项:
1 | ssh-keygen -t ed25519-sk -O resident |
这样生成的密钥可以在任一台电脑上通过命令 ssh-keygen -K
取回密钥对(Windows 上需要管理员权限,否则报错),之后可以正常进行密钥校验。此处同上,只有硬件和私钥同时存在才能使用,因此导出的私钥并不能在缺少硬件的情况下单独使用,安全性也有所保障。
当然,支持硬件的 SSH 认证并不只有这一种,比如 Securing SSH with OpenPGP or PIV,此处不多赘述。
外壳
外壳部分我使用的是 pat.vdleer 的模型,感谢他的作品,不过顶盖部分可能会在安装时直接卡住按钮,所以我提交了一个裁切版的顶盖模型打印配置可供选择。
参考
- RP2350刷Pico Fido教程_YubiKey(FIDO2安全密钥,助你远离网络钓鱼) 新的优化
- 30 元低成本自制开源版 Yubikey (支持 FIDO2 的硬件安全密钥)