前言

感谢 Cloudflare 让我用上了便宜的 Yubikey 😭

今年 9 月底,Cloudflare 官方博客更新了其 Zero Trust 产品如何与 Yubico 的硬件安全密钥 Yubikey 产品结合,以无缝实现防御网络钓鱼 1

除介绍其 Zero Trust 产品外,Cloudflare 还宣布与 Yubico 合作,面向所有计划的 2 Cloudflare 用户推出 Yubikey 优惠计划。

Yubikey Sale

每只 Yubikey 5 NFC 和 Yubikey 5C NFC 的优惠价格分别是 $10 和 $11.60,虽然最近美元兑人民币涨了一些,但是对比日常 $45 和 $55 可以说是很便宜了。

只需要有一个使用任意计划的 Cloudflare 账号,登录 Cloudflare 仪表盘 后,访问 申请优惠链接 申请优惠码

Claim Offer

等待邮件收到优惠码,每个优惠码仅可单次使用并且最多可购买一共 10 只 Yubikey(后面申请的最多只能购买 4 只了)。

Get Redeem Code

揽件日志

我用的是中环转运,客服傻瓜,转运速度超级慢,但是包税(总价低于 1000 RMB)。

  • 9 月 30 日 申请 Yubico x Cloudflare 优惠码
  • 10 月 5 日 收到优惠码
  • 10 月 5 日 下单 YubiKey 5 NFC - 2 Pack + YubiKey 5C NFC - Pack of 2
  • 10 月 6 日 USPS 发货
  • 10 月 8 日 到达美国转运仓库
  • 10 月 11 日 转运公司入库 + 出库(货到即发)
  • 10 月 12 日 货物分拣完成订舱中
  • 10 月 19 日 等待分配航班
  • 10 月 22 日 发往中国
  • 10 月 27 日 到达中国
  • 10 月 28 日 清关数据申报中
  • 10 月 31 日 等待清关
  • 11 月 15 日 等待清关
  • 11 月 16 日 清关完毕
  • 11 月 19 日 圆通揽件
  • 11 月 21 日 包裹到手

设置 Yubikey

考虑到在 macOS 上 Yubikey 的一些 GUI 管理工具仍然需要 Rosetta2 转译,我选择了 CLI 工具,安装所需的工具:

$ brew install pinentry-mac gnupg yubikey-personalization hopenpgp-tools ykman

OpenPGP

接下来,我准备使用之前算 PGP 靓号过程中「缝合」的一组密钥,假设这组密钥是这样的

身份  算法         KeyID       用 途 
pub ed25519 1CCCCCCCCCCCCCCC  [C]  # 主密钥
sub ed25519 2555555555555555  [S]  # 签名子密钥
sub cv25519 3EEEEEEEEEEEEEEE  [E]  # 加密子密钥
sub ed25519 4AAAAAAAAAAAAAAA  [A]  # 认证子密钥

先把这组密钥备份到一个 U 盘 3

# 备份主密钥私钥会包含主密钥公私钥 + 所有子密钥的私钥
# /Volumes/BakPak/ 是 U 盘路径
$ gpg --armor --export-secret-keys --export-options backup -o /Volumes/BakPak/1CCCCCCCCCCCCCCC.gpg 1CCCCCCCCCCCCCCC

# 创建一份密钥吊销证书存到 U 盘
$ gpg --output /Volumes/BakPak/Revoke.asc --gen-revoke 1CCCCCCCCCCCCCCC

# 如果你想单独备份每个子密钥私钥的话,注意密钥 ID 后面带上 ! 
# 签名子密钥
$ gpg  -ao /Volumes/BakPak/subkey-S.pgp --export-secret-subkeys 2555555555555555!
# 加密子密钥
$ gpg  -ao /Volumes/BakPak/subkey-E.pgp --export-secret-subkeys 3EEEEEEEEEEEEEEE!
# 认证子密钥
$ gpg  -ao /Volumes/BakPak/subkey-A.pgp --export-secret-subkeys 4AAAAAAAAAAAAAAA!

Yubikey 和 Canokey 的 OpenPGP 默认信息都一样:

  • PIN 123456
  • Admin PIN 12345678

将上面的三个子密钥分别转移到 Yubikey 中(以前的文章写过很多遍了,略),后面如果想将相同的密钥写入另一只 Yubikey 的话,移除当前的 Yubikey 并删除当前整个密钥串

# 选择主密钥 keyID
$ gpg --delete-secret-and-public-key 1CCCCCCCCCCCCCCC

从 U 盘导入之前密钥的备份

# 选择主密钥 keyID
$ gpg --import --import-options restore /Volumes/BakPak/1CCCCCCCCCCCCCCC.gpg

现在插入另一只 Yubikey,继续上面的子密钥转移操作。


后续可以修改下 OpenPGP 智能卡的一些个性化信息

$ gpg --edit-card
gpg/card>admin  # 启用管理员命令
Admin commands are allowed

# 下面都是可选的
gpg/card>name  # 更改持卡人的姓名
gpg/card>lang  # 语言偏好
gpg/card>login  # 登录信息
gpg/card>salutation  # 称呼
gpg/card>url  # 用于检索公钥的 URL

写入检索公钥的 URL,以后在新的机器上我们需要导入公钥的话,只需要插上 Yubikey

$ gpg --edit-card
gpg/card> fetch  # 通过 URL 检索公钥,然后就像下面这样 👇
gpg: requesting key from 'https://pgp.dejavu.moe/'
gpg: key 1A66666666666666: public key "Dejavu Moe <[email protected]>" imported
gpg: Total number processed: 1
gpg:               imported: 1

gpg/card> quit  # 退出

此外,建议修改 OpenPGP 应用的默认密码

gpg/card> passwd  # 修改密码
gpg: OpenPGP card no. xxxxxxxxxxxxx detected

1 - change PIN  # 建议修改 PIN
2 - unblock PIN
3 - change Admin PIN  # 建议修改 Admin PIN
4 - set the Reset Code  # 建议修改 Reset Code
Q - quit

Your selection?  # 输入数字序号选择

也可以用 Yubikey Manager CLI 工具修改信息

# 列出 Yubikey
$ ykman list --serials                                                                          
12345678

# 查看指定 Yubikey 的信息
$ ykman --device 12345678 info                                                                  
Device type: YubiKey 5C NFC
Serial number: 12345678
Firmware version: 5.4.3
Form factor: Keychain (USB-C)
Enabled USB interfaces: OTP, FIDO, CCID
NFC transport is enabled.

Applications	USB    	NFC
OTP         	Enabled	Enabled
FIDO U2F    	Enabled	Enabled
FIDO2       	Enabled	Enabled
OATH        	Enabled	Enabled
PIV         	Enabled	Enabled
OpenPGP     	Enabled	Enabled
YubiHSM Auth	Enabled	Enabled

# 查看 Yubikey OpenPGP 信息
$ ykman openpgp info                                                                         7s 13:18:19
OpenPGP version:            3.4
Application version:        5.4.3
PIN tries remaining:        5
Reset code tries remaining: 5
Admin PIN tries remaining:  5
Signature PIN:              Always
Touch policies:
  Signature key:      Off
  Encryption key:     Off
  Authentication key: Off
  Attestation key:    Off

# 更改 PIN, Admin PIN, Reset Code
$ ykman openpgp access change-pin                                                                   
Enter PIN: ******
New PIN: ******
Repeat for confirmation: ******

$ ykman openpgp access change-admin-pin                                                         
Enter Admin PIN: ********
New Admin PIN: **********
Repeat for confirmation:

$ ykman openpgp access change-reset-code                                                        
Enter Admin PIN: **********
New Reset Code: **********************
Repeat for confirmation: **********************

# 设置 PIN, Admin PIN, Reset Code 重试次数。
$ ykman openpgp access set-retries 5 5 5                                                        
Enter Admin PIN: ********
Set PIN retry counters to: 5 5 5? [y/N]: y

# 签名密码策略用于控制在使用签名密钥时是否总是需要密码 (always)
# 或者在每个会话中只需要一次 (once)
$ ykman openpgp access set-signature-policy once                                           
Enter Admin PIN: ********

# 修改每个 OpenPGP 卡槽的触摸策略-缓存
$ ykman openpgp keys set-touch sig Cached                                                           
Enter Admin PIN: ********
Set touch policy of SIG key to cached? [y/N]: y

$ ykman openpgp keys set-touch enc Cached                                                        
Enter Admin PIN: ********
Set touch policy of ENC key to cached? [y/N]: y

$ ykman openpgp keys set-touch aut Cached                                                        
Enter Admin PIN: ********
Set touch policy of AUT key to cached? [y/N]: y

OTP

我之前不小心把 Yubikey 默认的 OTP 删除了,下面需要重新生成 OTP 信息并在 Yubikey 官方服务器上注册 4

用 Yubikey Manager CLI 生成新的 OTP 存到 OTP 应用的卡槽 1,并将生成的信息以文本方式存到当前用户目录的 5nfc.1.otp 文件里(备份)

$ ykman otp yubiotp -S -g -G -O 5nfc.1.otp 1
# 恢复默认 NDEF URI 前缀
$ ykman otp ndef 1

然后打开 Yubico OTP Key Upload 上传刚才注册 OTP 信息,分别填写下面信息

Register OTP

点击 Upload 后稍等片刻,出现下面提示表示注册完成,可以点击 Try it out 尝试验证 OTP

Upload OTP

OATH

使用 Yubico Authenticator,支持 Windows, Linux, macOS, Android, iOS, iPadOS。

PIV

暂时用不上,略

拿到手了拆开包装就没有快感了唉,跟 Canokey 也没啥不一样,就酱吧 🙃

参考资料:


  1. The (hardware) key to making phishing defense seamless with Cloudflare Zero Trust and Yubico ↩︎

  2. 包括免费计划 (Free Plan) 用户 ↩︎

  3. 因为子密钥转移到 OpenPGP 智能卡的过程是不可逆的,我想要两只密钥都写入一样的密钥,因此要先备份一下。 ↩︎

  4. 此外,我还需要注册一个 Yubikey OTP API 用于 Vaultwarden 的 Yubikey OTP 验证 ↩︎