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

配置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
我遇到的是两个问题:
- 提示没有scdaemon
- 提示找不到智能卡,实际上是没有pcscd
这两种情况只需要
apt install一下就可以了。 (关于GPG下文再谈)
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又短又快,好像确实是这样,不过选择曲线就讲究了,听说某些曲线是动过手脚有后门的。
规避这种风险,可以选
update: secp256k1(中本聪,比特币发明者,密码学专家,就是这么考虑的),但是长度只有256bit,安全性逊于RSA4096bit(不过前者也是足够用的)。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 签名