使用Yubikey 4作为OpenPGP Card

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

如何查看OpenPGP Card状态

使用命令gpg2 –card-status 。

如何处理卡死的GPG Agent

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

#!/bin/bash

echo "kill gpg-agent"
code=0
while [ 1 -ne $code ]; do
    killall gpg-agent
    code=$?
    sleep 1
done

echo "kill ssh"
killall ssh

echo "kill ssh muxers"
for pid in `ps -ef | grep ssh | grep -v grep | awk '{print $2}'`; do
    kill $pid
done

echo "restart gpg-agent"
eval $(gpg-agent --daemon)

echo
echo "All done. Now unplug / replug the card."
echo

执行完重新插拔下Yubikey。

如何重置Yubikey的OpenPGP Card

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

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

/hex
scd serialno
scd apdu 00 20 00 81 08 40 40 40 40 40 40 40 40
scd apdu 00 20 00 81 08 40 40 40 40 40 40 40 40
scd apdu 00 20 00 81 08 40 40 40 40 40 40 40 40
scd apdu 00 20 00 81 08 40 40 40 40 40 40 40 40
scd apdu 00 20 00 83 08 40 40 40 40 40 40 40 40
scd apdu 00 20 00 83 08 40 40 40 40 40 40 40 40
scd apdu 00 20 00 83 08 40 40 40 40 40 40 40 40
scd apdu 00 20 00 83 08 40 40 40 40 40 40 40 40
scd apdu 00 e6 00 00
scd apdu 00 44 00 00
/echo Card has been successfully reset.

如何创建一个OpenPGP沙箱环境

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

export GNUPGHOME=/tmp/pgp_sandbox
mkdir -m700 -p $GNUPGHOME

返回默认数据库使用:

export GNUPGHOME=

如何设置Yubikey作为OpenPGP Card

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

Application ID ...: [redacted]
Version ..........: 2.1
Manufacturer .....: Yubico
Serial number ....: [redacted]
Name of cardholder: [not set]
Language prefs ...: [not set]
Sex ..............: unspecified
URL of public key : [not set]
Login data .......: [not set]
Signature PIN ....: not forced
Key attributes ...: 2048R 2048R 2048R
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 0 3
Signature counter : 0
Signature key ....: [none]
Encryption key....: [none]
Authentication key: [none]
General key info..: [none]

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

gpg/card> admin
Admin commands are allowed

gpg/card> passwd
gpg: OpenPGP card no. [redacted] detected

1 - change PIN
2 - unblock PIN
3 - change Admin PIN
4 - set the Reset Code
Q - quit

Your selection?

这里要依次设置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> name
Cardholder's surname: 姓
Cardholder's given name: 名

gpg/card> lang
Language preferences: 两位语言代码(如 en)

gpg/card> url
URL to retrieve public key: 能获取到你 public key 的网址

gpg/card> sex
Sex ((M)ale, (F)emale or space): 输入 M 或者 F

gpg/card> login
Login data (account name): 登录账户名

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项,说明导入成功;否则重新导入该子密钥。最后保存修改:

gpg> quit
Save changes? (y/N) y

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

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

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

快速启用:

curl https://gist.githubusercontent.com/a-dma/797e4fa2ac4b5c9024cc/raw/dd9612337e91a4a3e212bbf72c8521c3efb1ea6b/yubitouch.sh -o yubitouch.sh
chmod +x ./yubitouch.sh
./yubitouch.sh sig on
./yubitouch.sh aut on
./yubitouch.sh dec on

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

==========

参考资料:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据