使用Yubikey 4作为OpenPGP Card

一些操作,脚本以及预先踩过的坑的集合。

如何查看OpenPGP Card状态

使用命令 gpg2 --card-status 。

如何处理卡死的GPG Agent

GPG这个东西挺不靠谱的,经常出现卡死或者读不出卡之类的问题。以下脚本修复:

执行完重新插拔下Yubikey。

如何重置Yubikey的OpenPGP Card

如果数据写坏了或者卡设置错误,可以用以下方法重置。

把以下内容保存成文件,然后用 gpg-connect-agent -r filename 执行:

如何创建一个OpenPGP沙箱环境

怕玩坏原有的OpenPGP数据库的话可以创建一个新的临时数据库用于实验:

返回默认数据库使用:

如何设置Yubikey作为OpenPGP Card

首先运行 gpg2 --card-edit ,你会看到类似以下内容:

说明Yubikey正常连上了。接下来我们在GPG Shell当中重新设定几个PIN:

这里要依次设置Admin PIN和PIN。(如果这张OpenPGP Card不是给别人使用的话,不需要设置Reset Code;否则设置Reset Code并告知对方。)如果你设置了非纯数字内容导致GPG Agent卡死的话,参照上面的脚本重置它。

PIN名称格式默认值用途备注
Admin PIN8位以上纯数字12345678修改卡设置和各项信息输错一次以后会锁定卡
PIN6位以上纯数字123456使用私钥前验证身份输错三次以后会锁定卡,必须使用另外二者之一重置PIN
Reset Code纯数字重置PIN

然后设置OpenPGP Card元数据:

gpg/card> 提示后直接按回车,可以看到元数据已经被修改。完成之后就可以输入 quit 退出GPG Shell了。

如何导入已有的PGP Key

先备份你的private key!

运行 gpg2 --edit-key your-key-id 进入GPG Shell,然后运行 toggle 选中私钥。不要导入主密钥;针对每一个子密钥,用 key n 命令(n从1开始)去选中或取消选中(选中后会出现一个星号;每次只能选择一个导入,所以导入下一个的时候需要先反选上一个),然后用 keytocard 导入到正确的卡存储区域中。如果一个子密钥有两个或更多capability,那么需要导入多次(这里会比较蛋疼,因为一个key一旦导入就在本地删掉了,所以你得删掉本地保存的private key再重新操作一次)。

Capability存储区
s(1) Signature key
e(2) Encryption key
a(3) Authentication key

此时按回车,确保所有子密钥下面都出现了相同的card-no项,说明导入成功;否则重新导入该子密钥。最后保存修改:

如果你不幸导入了主密钥(sign时提示 gpg: signing failed: Wrong secret key used 往往是这个问题)或者导入了错误的密钥,在重新导入时会失败。这时候你需要删掉已保存的private key,从备份文件重新导入。

要求Yubikey在使用OpenPGP功能时必须按下实体按钮

可以使用这个脚本:https://gist.github.com/a-dma/797e4fa2ac4b5c9024cc

快速启用:

如果重新导入了key,需要重新执行这个脚本。

==========

参考资料:

发表评论