1887 字
9 分钟
低成本自制 Pico Keys 硬件安全密钥(RP2350)

更新#

目前 pico-fido2 项目已转为商业发布模式,每台硬件需支付 25 美元授权费用
同时项目已启用固件签名验证,刷入官方固件后将无法再刷入其他第三方固件
因此本文所述的低成本自制安全密钥方案已失效,本文内容仅作为历史记录留存,不再推荐实际使用。
如有需要可以考虑如下项目

librekeys
/
pico-fido-firmwares
Waiting for api.github.com...
00K
0K
0K
Waiting...
librekeys
/
pico-fido2
Waiting for api.github.com...
00K
0K
0K
Waiting...
librekeys
/
picoforge
Waiting for api.github.com...
00K
0K
0K
Waiting...

三年前,我通过 Cloudflare 和 Yubico 的活动购买了几枚超低价的 Yubico 5 NFC 安全密钥

平时一主一备使用,不幸的是我丢失了备用的密钥,只剩下主用的密钥

这导致平时使用时小心翼翼,生怕再次丢失主用的密钥

好巧不巧的是前一段时间又爆出 Yubico 老版本的固件存在漏洞问题,便心生打算再搞一个新的进行备用

因为 Yubico 5 NFC 的价格仍然很贵,并且看到存在自制硬件密钥的方案,综合成本大概是30元左右,那么用作备用就再好不过了

一、Pico Keys 项目#

Pico Keys 是一个开源的 GitHub 项目,提供两个仓库版本,均可将 Raspberry Pi Pico 或 ESP32 等微控制器变成安全密钥:

  • 仅支持 FIDO 的版本pico-fido

    • 支持 FIDO2 和 U2F 协议
    • 支持 WebAuthn 认证
    • 支持多种椭圆曲线(SECP256R1、SECP384R1、SECP521R1、SECP256K1、Ed25519)
    • 支持 PIN 码和物理按钮验证
    • 支持发现式凭证(Resident Keys)和凭证管理
    • 支持 HMAC-Secret 和 CredProtect 扩展
  • 支持 OpenPGP 的版本pico-fido2

    • 包含上述 FIDO 功能
    • 支持 OpenPGP 智能卡功能
    • 支持 RSA(1024–4096 位)和多种 ECC 曲线
    • 支持 SHA1、SHA256、SHA384、SHA512 等摘要算法
    • 支持 ECDSA 和 RSA 签名、ECDH 密钥派生
    • 支持 PIN 码授权和 PKCS#11 接口
    • 内置硬件随机数生成器

二、硬件选择#

目前 Pico Keys 支持以下几款芯片及对应的开发板:

  • ESP32S3

    • 内置 Wi-Fi 和蓝牙,适合无线认证场景
    • 支持 USB OTG,可用作安全密钥
    • 对于仅作为 USB 安全密钥的场景,ESP32 的无线能力并非优势,反而可能增加攻击面
  • RP2040 / RP2350

    • RP2040 是 Raspberry Pi Pico 使用的芯片
    • RP2350 是 Raspberry Pi Pico 2 使用的芯片

2.1 芯片推荐选择RP2350#

  • RP2040 缺乏硬件级安全隔离与安全启动,在有物理接触 + 专业攻击条件下,密钥被提取的风险更高

  • RP2350 提供了 Secure Boot / Secure Lock / 签名校验能力可以显著提高攻击门槛,但:

    • 并不等价于 Secure Element(SE)
    • 也不等价于 YubiKey 这类通过 FIPS/CC 认证的硬件

需要说明的是,RP2350 的安全能力仍然无法与商用安全密钥中使用的 Secure Element 相提并论,仅适合作为成本敏感或备用场景使用

2.2 推荐开发板Waveshare(微雪) RP2350-One#

  • 体积小巧,便于携带
  • 市场价格低廉,1688约 34 元即可包邮购买

三、固件下载及制作#

1. 固件下载#

2. 刷写固件#

  1. 在按住 BOOT 键的情况下将硬件插入电脑,此时硬件会显示为一个可存储的磁盘空间
  2. 将得到的固件文件放入U盘中,此时固件会被加载,文件管理器的页面会被关闭,同时会自动断开并连接硬件
  3. 此时硬件已经刷写完毕

3. 设备配置#

前往项目官网进行设备配置 Pico Commissioner - Pico Keys

  • 选择 Vendor 为 YubiKey 4/5

  • VID 参考 https://support.yubico.com/hc/en-us/articles/360016614920-YubiKey-USB-ID-values

    • 若设置为 1050:0407,则将被识别为 YubiKey 5 NFC (OTP+FIDO+CCID)
    • 可能和 Vendor 存在冲突,不可同时设置,wndows未成功完成设置
    • 该方式本质上是通过 VID/PID 与设备描述信息实现兼容性伪装,仅用于个人测试和使用场景,不建议在企业或受控环境中使用
  • Product Name 设置为 yubico yubikey,只有这样自制的硬件才能被 yubikey 相关的软件识别并管理。

  • LED brightness 设置为 1,数值越高,LED亮度越高

  • Options 开启 LED dimmable Secure Boot Secure Lock,这三个选项,分别是LED控制、安全启动和安全锁

    • 特别注意,开启 Secure Boot 后默认只能运行 pico keys 官方签名固件,但也可以通过自签名方式运行自行构建的固件,以在安全性和可控性之间做取舍
    • 如果不希望只能使用 pico keys 官方固件但希望开启Secure Boot,可以使用 自签名

4. 设备调试 (WebUSB):#

  • 点击 commissioned with WebUSB 进行调试,并在弹窗中选择设备pico keys,随后重新插拔设备
  • 点击 Commission via WebAuthn进行测试,第一次使用会要求设置PIN,之后使用此密钥、查看密钥信息都需要输入此PIN

5. 重置或清空开发板存储#

  1. 同刷写固件步骤,在按住 BOOT 键的情况下将硬件插入电脑,将清除固件文件放入磁盘空间中

  2. 此时固件会被加载,文件管理器的页面会被关闭,同时会自动断开并连接硬件

  3. 等待固件程序清除开发板存储,清除完毕会再次自动断开并连接usb设备,并显示可存储的磁盘空间

  4. 此时硬件已经清除完毕

四、使用方法#

1. 按键与交互说明#

Waveshare RP2350-One 开发板上有两个按键:

  • BOOT 键

    • 用于进入刷写模式
    • 也是 Pico Keys 在日常使用中的用户确认键(等同于安全密钥的触摸确认)
  • RESET 键

    • 仅用于重启设备
    • 不参与认证或确认操作

刷写固件或清空存储时,需要在按住 BOOT 键的情况下插入 USB,或在已插入 USB 时按住 BOOT 再按 RESET

日常使用时,直接插入设备,不要按任何按键

2. 短按 / 长按 行为说明#

RP2350-One 的按键不支持真正的硬件级长按检测,Pico Keys 通过按键节奏区分操作:

  • 短按一次 BOOT 键:普通确认操作
  • 连续快速按两次 BOOT 键:等效于“长按”

在凭证管理、OpenPGP 操作或部分管理场景中,可能需要使用“长按”行为。如果操作无响应,可以尝试连续按两下 BOOT 键

3. PIN 与管理密码#

设备初始状态下使用默认凭据:

  • 默认 PIN123456
  • 默认 管理密码12345678

首次进行 WebAuthn / FIDO2 注册或管理操作时,系统会要求输入或设置 PIN 强烈建议首次使用后立即修改 PIN 和管理密码,否则在设备丢失时存在明显安全风险

4. 使用场景举例#

常见使用流程如下:

  1. 将设备插入电脑 USB 接口
  2. 在网站或应用中触发安全密钥认证(如登录、注册)
  3. 浏览器或系统提示“请触摸安全密钥”
  4. 短按 BOOT 键完成确认

该流程适用于:

  • WebAuthn / FIDO2 登录
  • 支持 U2F 的旧系统
  • 启用 OpenPGP 功能后的签名或认证操作(取决于固件配置)

5. 测试与管理工具#

可通过以下网站测试 Pico Keys 是否工作正常:

设备管理与日常使用可配合以下工具:

  • Yubico Authenticator
  • YubiKey Manager
  • ykman(命令行工具)

在查看设备信息、管理凭证或进行高级操作时,通常需要输入 PIN

低成本自制 Pico Keys 硬件安全密钥(RP2350)
https://www.self4m.com/posts/pico-keys-rp2350-hardware-security-key/
✍️作者
Self4m
📅发布于
2025-09-27
©️许可协议
CC BY-NC-SA 4.0

商业用途必须事先获得作者授权;
非商业用途可以使用,但必须注明出处;
若有改编需采用相同许可协议发布。