前不久买了个YubiKey 5 NFC,到手后顺便也折腾好了自己的PGP Key。以前对GPG有点云里雾里的,自己折腾下概念基本算是明白了。

YubiKey 5 NFC 到手拍摄,很小的一个

配置YubiKey和GPG这类正经的加密工具,这种事情我是不太想在Windows下做(其实没有什么关系),于是使用Linux(Kali)。配置的时候遇到一点小坑,以下就当记录了。

YubiKey 初始配置,以及OpenPGP smartcard

一开始想用GUI,不过这个好像在CLI也是很方便的。需要安装Yubikey-Manager:

sudo apt-add-repository ppa:yubico/stable \
sudo apt update \
sudo apt install yubikey-manager

安装完之后插上YubiKey,正常的话ykman list应该会输出设备列表了。 用起来还是很简单的,敲ykman就出来命令列表。刚拿到手的YubiKey没有啥特别需求用默认配置就行,功能全是打开了的。可以改一下OpenPGP的PIN和Admin PIN。

在GPG中查看智能卡状态:

gpg --card-status

我遇到的是两个问题:

YubiKey FIDO

即插即用,用USB和NFC连接效果都不错。安卓通过NFC使用FIDO需要合适版本的谷歌服务框架,目前支持的浏览器有Chrome,Firefox不知道没试。就是不知为何给谷歌帐号用USB配置安全密钥时没有反应,不过用NFC就行了。USB和NFC在同一网站应该是有一个共同密钥的,这样就可以在电脑上注册某网站后,在手机上以同样身份登录。(这好像是句废话,不过我之前担心过这个问题。)

题外话:"钥"到底该怎么读?

精选答案:我不知道 两种读音:yao和yue,两边都说得有道理。这是个争议问题,目前大概是两者都可以用吧,听说央视节目中也是出现两种读音。闲着,我查了现代汉语词典第7版,以及新华字典第11版,没有明说(不过,我查到了"钥匙"也可以读作"yue shi")。听说在通俗的词(如"钥匙")中读yao,在密码学专有名词(如"密钥""公钥")中读yue,仅供参考。

GPG搭配YubiKey使用

首先生成个GPG主密钥

gpg --full-gen-key --expert

选择主私钥类型时,我选择(8) RSA(自定义用途),4096bit。这个算是比较安全的,至于说ECC又短又快,好像确实是这样,不过选择曲线就讲究了,听说某些曲线是动过手脚有后门的。 规避这种风险,可以选secp256k1(中本聪,比特币发明者,密码学专家,就是这么考虑的),但是长度只有256bit,安全性逊于RSA4096bit(不过前者也是足够用的)。 update: secp256k1不是默认曲线还是有原因的,也许它不适用于BTC外的应用...建议用Ed25519(又名Curve25519),这是目前常用曲线。误导了各位就不好了。

另外,使用 secp256k1 的密钥无法导入 GitHub 的 GPG Keys ,也就是说用这样的密钥签名你的 Git 提交会在 Commits 列表显示一个橙色的 Unverified ,很难受吧...

主密钥我设置为只用于管理子密钥,所以不常用,那就RSA4096bit好了。 子密钥设置为secp256k1(不过Ed25519是常用的曲线),密文和签名会很短。

进入GPG密钥编辑

gpg --edit-key --expert <user-id>

使用addkey添加子密钥。如果使用addcardkey,密钥确实在智能卡中了,不过无法导出,YubiKey丢了会很麻烦。所以建议是addkey,然后

gpg --export-secret-subkeys -a <key-id>!  # 感叹号(应该)是必要的,表示仅导出这个私钥   

可以导出备份。至于key-id,可以在edit-key页面输入toggle查看。

然后将子密钥导入YubiKey。首先应更改YubiKey中密钥槽的属性,否则可能无法将密钥导入指定的密钥槽。

gpg --edit-card --expert
verify
admin
key-attr

然后退出智能卡编辑,再编辑密钥

gpg --edit-key --expert <user-id>
key <key_seq> # 选择或反选,被选中的密钥前面会有个”*“符号
keytocard

然后导出公钥,在各个设备上随意使用吧:)

gpg --export -a <user-id> > file.gpg.asc    

安卓设备上的PGP: OpenKeyChain

一款开源软件,可以在 Google Play 和 F-Droid 下载。这里就不放图了,可以轻松上手。

搭配 Oversec (开源软件,可在 F-Droid 下载),可以在任何即时通信或者电子邮件应用中实现 E2EE(端到端加密)的安全性。也许以后会专门开一篇介绍这个。

搭配 ykdroid (同上),可以让 OpenKeyChain 通过 NFC 或 USB 使用 YubiKey 内存储的 PGP 密钥。

最后

欢迎用PGP加密(不过真的有人会这样做吗...),给我发送邮件或是各平台私信。查看我的联系方式和PGP Key,这里:联系我

参考的博客/文章

你可以在这里查阅更详细的信息。按URL字典序正序排列。

YubiKey入手和介绍
Yubikey 的使用体验
YubiKey 初使用 & GPG 使用教程
GPG 与端到端加密:论什么才是可以信任的
我们来聊聊信息安全:Yubikey 4 简介与配置
Yubikey OpenPGP Card 略高级折腾手记
yubikey使用初体验
使用 Yubikey 进行 GPG 签名