一些操作,脚本以及预先踩过的坑的集合。
如何查看OpenPGP Card状态
使用命令 gpg2 --card-status 。
如何处理卡死的GPG Agent
GPG这个东西挺不靠谱的,经常出现卡死或者读不出卡之类的问题。以下脚本修复:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#!/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 执行:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/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数据库的话可以创建一个新的临时数据库用于实验:
1 2 |
export GNUPGHOME=/tmp/pgp_sandbox mkdir -m700 -p $GNUPGHOME |
返回默认数据库使用:
1 |
export GNUPGHOME= |
如何设置Yubikey作为OpenPGP Card
首先运行 gpg2 --card-edit ,你会看到类似以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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 PIN | 8位以上纯数字 | 12345678 | 修改卡设置和各项信息 | 输错一次以后会锁定卡 |
PIN | 6位以上纯数字 | 123456 | 使用私钥前验证身份 | 输错三次以后会锁定卡,必须使用另外二者之一重置PIN |
Reset Code | 纯数字 | 重置PIN |
然后设置OpenPGP Card元数据:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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项,说明导入成功;否则重新导入该子密钥。最后保存修改:
1 2 |
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
快速启用:
1 2 3 4 5 |
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,需要重新执行这个脚本。
==========
参考资料:
- gpg-agent gets stuck when used with smartcards in ssh-agent mode
- reset your ykneo-openpgp applet
- OpenPGP smartcards and Gentoo – part 2: card and gnupg setup
- [SOLVED] How to reset a permanently locked “new” NEO?
- Yubikey/OpenPGP Smartcards for Newbies
- HOW TO USE YOUR YUBIKEY WITH OPENPGP
- Offline GnuPG Master Key and Subkeys on YubiKey NEO Smartcard
- Using GPG with Smart Cards