Yubikey 5C NFC 探索之旅

前记

之前 Yubikey 打折薅了几个回来,自己留了几个,最近 CloudFlare x Yubico 又拿了几个 code 这次如果转运顺利后续再发个文章讲讲新路历程吧。那手上这枚 Yubikey 不能浪费了,正好最近网络安全技术在讲 PGP ,又正好自己想玩玩 GnuPG 和 SSH 就来记录下过程,方便以后回看。然后原本说结合一些博客直接上手的结果最后还是得自己去翻产品文档,纯英文文档不能说读不懂吧,就是该吃力还是得吃力。

可能是这两年就业形势不好吧,最近有点被这种气氛影响了,突然显得不知所措,感觉自己什么都知道一点什么都学不精,但是一直沉浸在这种思考好像也不太好,索性自己再搞点奇奇怪怪的东西,毕竟能学多少是多少,万一之后能用到呢 /doge,这枚 Yubikey 也就当做是我最近迷茫的生活中的一点小调剂吧~

更新记录

2022 年 10 月 24 日

因为实验室寄了,所以这篇文章为了备份我的记录也就提前上线了,里面还有非常多不完善的地方,都会随着我的探索更新,基本上目前才把如何把 Key 丢进 Yubikey 的 OpenGPG Card 写完,还没写应用,还没细写FIDO OATH PIV。一开始走了弯路所以先把 PIV 基础资料完善了,后来才发现完全不需要,就把他丢到了功能介绍里面,用到的OpenGPG 反而没有细写,因为被 gank 了,所以得先把其他 DDL 推迟,慢慢探索和处理了,不知道这篇写出来会不会有人看,希望有吧,就算有几个人看都不会感觉自己写了一堆废话(,虽然我折腾之前稍微读了10~20篇博客,但是还是把坑踩满了,希望后面看到的人不踩吧。

2022 年 11 月 4 日

调整了下排版,把大篇成体系的内容单独丢到子文章去了,这篇主文章就当做是一个目录和大致的内容介绍吧~

更新了 Yubikey 联动 Git

关于我的 Yubikey

Yubikey 功能介绍

FIDO2

FIDO2 相当于是 Web 方面的强验证手段,对于高机密性网站(例如 GitHub、Cloudflare、Binance 等)需要更强的 2FA 的手段,当然 Yubikey 支持 OATH 但是呢,我还是更习惯用 Google Authenticator 不过或许之后可以再试试。

然后就索性给 GitHub、Binance 什么的都开了 FIDO2 的 2FA 验证,不过某种程度上确实更方便了,毕竟你不用打开手机 App 了。只用把 Key 插上电脑按一下,就可以通过 2FA 了,既安全又方便。

OATH

@TODO

OpenPGP

官方文档地址:https://docs.yubico.com/software/yubikey/tools/ykman/OpenPGP_Commands.html

这也是本次实验的重点,原本我错误的认为我会使用到 PIV 然后看了半天文档,结果发现有自带的 OpenPGP 的 Card 的功能,这样确实省事多了,所以可能就不用 PIV 了之后如果有新探索的话就再讲讲吧。

PIV

Yubikey Manager PIV 管理信息

为了安全考虑请尽量不要使用以下默认信息,及时修改:

PIN(用户权限):123456

PUK(用户权限):12345678

管理密钥(管理员权限):010203040506070801020304050607080102030405060708 (3DES/TDES)

PIV_ConfigurePINs

在使用之前请务必将以上 3 个 Key 改为非默认值

PUK 本质上是 16 为 16 进制的 Key,输入进去的 printable 会被转换为 2 位 16 进制,所以如果你想的话可以设置一些不能直接输入(unprintable char)字符,从某种程度上也可以提升一些安全性(指被别人捡到后),虽然 3 次机会大概率也试不出来正确的 Key 就对了。

Yubikey 槽位

在 Yubikey 中有槽位的设计,为了避免浪费,可以先看一下,总计 24 个槽位。

82 - 95 总计 19 个 槽位,用于曾经被覆盖掉的 Key 存储的地方,方便你还是可以解密文件和邮件等。

9a 槽位用于 PIV 验证,用于验证卡和卡持有人,例如在使用卡登录系统时。首次操作私钥会要求用户输入 PIN 码。PIN 验证后,后续其他的私钥操作不会再要求 PIN 码。

9b 槽位用于管理密钥,此槽位具有管理整个 Yubikey 的证书配置的权限,所以在正式使用 Yubikey 之前需要修改,修改方式上文有提到。

9c 槽位用于数字签名,用于对文档、邮件、文件、应用等进行签名。执行私钥操作以及后续所有操作都需要使用 PIN 码解锁。

9d 槽位用于密钥管理,用于对文件、邮件等进行加密,首次操作私钥会要求用户输入 PIN 码。PIN 验证后,后续其他的私钥操作不会再要求 PIN 码。

9e 槽位用于卡验证,用于支持其他物理访问应用程序?反正官方文档是这样写的......该槽位的使用并不需要任何 PIN 码的验证。

This certificate and its associated private key is used to support additional physical access applications, such as providing physical access to buildings via PIV-enabled door locks. The end user PIN is NOT required to perform private key operations for this slot.

f9 槽位用于认证,不过应该属于特殊槽位?官方文档是这样写的,用不太到就自行理解吧,感觉像是衍生密钥验证归属,此槽位只能覆写不能重置。

This slot is only used for attestation of other keys generated on device with instruction f9. This slot is not cleared on reset, but can be overwritten.

好了讲完槽位,那么我们这次 PGP 应用实验理论上只会用到 9b、9c、9d(这不是还是用了快一半)。也对应了 3 个 PGP Key 的功能,Certification,Signing,Encryption。

Yubikey Manager

下载 Yubikey Manager 后,可以管理你的 Key 通过不同的方式(例如 USB、NFC)所能使用的功能。

Yubikey_Manager_Interfaces.png

默认是全开的,可以根据自己的安全性需要手动调整,但是对于我自己来说,NFC 意义有限,毕竟我手机可以直接插入 Type-C 所以看情况可以全关吧(

那对于这次实验用 PGP 对邮件进行签名,那我就先翻了几篇博客,因为看到 Yubikey 有槽位设计,防止自己干蠢事,看了看别人整理好的博客(我确实懒了,官方 Document 有亿点点多,结果最后还是得自己翻文档),按照之前差的资料一般用 PIV 也就是 个人身份与验证卡 接口 也叫作 FIPS 201

首先 PIV 有类似于 SIM 卡一样的 PIN 码 ,PUK 码的设计,PIN 码连续 3 次输入错误后,需要使用 PUK 码解锁并修改 PIN 码,但同样如果 PUK 码连续 3 次输入错误,则会将 PUK 码锁定,如果发生了以上情况,需要重置整个设备,所有已配置的 PIV 证书也会重置,所以请避免发生这种情况。

PGP 密钥准备 与 Yubikey 配置 OpenPGP

由于主文章实在是太长了,把这部分单独拆分出去了,简单来说,你需要 OpenPGP 进行密钥的创建, 但一个主密钥直接进行操作肯定是不符合最佳实践的,那么我们就需要把利用主密钥创建几个子密钥,每个子密钥有不同的权限,再将子密钥导入 Yubikey,Yubikey 5C NFC 自带了一个非常方便的 OpenPGP Card 的功能,所以不需要使用 PIV 的槽位了,使用这一系列的功能之前,请务必进行重置密码的操作,不然会有安全风险,有关管理密码重置也在下面这篇文章中~

https://www.wd-ljt.com/post/1104/914.html

PGP x Yubikey 的应用 @1362781327

电子签名类

Git Commit

稍微折腾了下,踩了 1-2 个坑,让你的 Commit 记录打上 Verified 标签(毕竟这也是 GitHub 官方鼓励的行为),不如来上手试试~

https://www.wd-ljt.com/post/1104/922.html
Yubikey 签署 Commit 的详细教程~

文件类

加解密文件

签名文件

邮件类

加密邮件

邮件签名

SSH 登录

PGP 公钥转 OpenSSH 公钥

先在你的服务器或者虚拟机上装一个 GPG2,以 Ubuntu22 为例

sudo apt-get install gnupg2 -y

那刚刚我们导出了 Key 或者说发送了 Key 到 KeyServer 上,那么我们这时候两个都可以选,我就选从 KeyServer 上下载下来。

gpg2 --keyserver keyserver.ubuntu.com --recv-key 你的主密钥 ID
gpg: directory '/home/*/.gnupg' created
gpg: keybox '/home/*/.gnupg/pubring.kbx' created
gpg: /home/wdljt/.gnupg/trustdb.gpg: trustdb created
gpg: key *: public key "WDLJT (Hello New World!) <i@wd-ljt.com>" imported
gpg: Total number processed: 1
gpg:               imported: 1

然后我们用 OpenSSH 公钥的方式导出出来。

gpg2 --export-ssh-key 你的主密钥 ID >> ./authorized_keys

当然我是为了方便以后所以随便丢了个目录存起来,你也可以一步到位。

gpg2 --export-ssh-key 你的主密钥 ID >> ~/.ssh/authorized_keys

如果没有目录的话用 keygen 先预先生成一个再替换,如果显示没有可用的密钥的话可以参考这篇文章

连接 SSH

参考本文

感谢观看我的博客~
Yubikey 5C NFC 探索之旅
https://www.wd-ljt.com/post/0614/897.html
来源于问谛居,转载记得联系作者哟~
THE END
分享
二维码
海报
Yubikey 5C NFC 探索之旅
花了很长一段时间专门研究了下 Yubikey,别看这个 U 盘大小只有几十克的小东西,想要完整的折腾一枚 Yubikey 第一次确实花了不少时间,就想吧这个记录记下来发一篇博客,说不定还可以与更多人交流这个过程经历,OpenPGP 初体验,尝试用 Yubikey 通过服务器 SSH 的验证等等,一起来探索吧!
<<上一篇
下一篇>>
文章目录
关闭
目 录