Yubikey 上的 GPG 密钥对
简单记录一下 Yubikey 上 GPG 密钥的生成与导入过程
需要注意的是 Yubikey 支持 PIV 智能卡和 GPG 智能卡,此处仅涉及 GPG 智能卡部分,使用时应当分辨 PIV 与 GPG 接口。PS. 有开发者指出 GPG 与 Windows 智能卡驱动程序存在冲突
生成密钥
为保证安全, GPG 密钥对一般采取 C + A + E + S 的方式使用,其中 C (Certify) 为主密钥对,负责签发、吊销证书; A (Auth), E (Encrypt), S (Sign) 为三个子密钥对,分别负责验证、加密和签名。
首先创建主密钥对
1 |
gpg --expert --full-generate-key |
根据提示需要选择加密算法和密钥用途
加密算法有 RSA 、 DSA 和 ECC , RSA 基于大数分解(素数乘积), DSA 基于整数有限域离散对数, ECC 是椭圆加密算法,从安全性上来说, ECC 最佳, RSA 和 DSA 也同样安全,但 ECC 作为一种较新的加密算法可能存在兼容问题,推荐使用更为通用的 RSA 算法。
密钥用途应为 Certify ,并不在列,所以选择 set your own capabilities
随后根据提示,将主密钥的允许项切换为单一 Certify 功能,按 Q 继续
接下来决定密钥长度,根据记载 RSA 1024 的安全性受到暴力破解的威胁,使用2048的长度更为安全,同时要注意到 Yubikey 所支持的最大长度。
然后是密钥的过期时间,一种偷懒的做法是将主密钥对的过期时间设置为0,即永不过期
键入 UID ,一个密钥可以有多个 UID ,方便不同场合使用, UID 与子密钥对无关,作用于整个密钥, UID 可以随时添加,但已有的 UID 不能修改,只能单独吊销。
之后需要为主密钥对设定一个 Passphrase 来作为密码保护主密钥对
We need to generate a lot of random bytes. It is a good idea to perform some other action (type on the keyboard, move the mouse, utilize the disks) during the prime generation; this gives the random number generator a better chance to gain enough entropy.
最后根据提示,随便做些什么生成随机数,主密钥对也就生成了。
使用主密钥对的 hash 字符串 或者 UID 来对主密钥对进行编辑
1 |
gpg --expert --edit-key [Hash/UID] |
进入主密钥对后,使用 addkey 分别生成用于 A (Auth), E (Encrypt), S (Sign) 的三个子密钥对。
完成之后使用 save 保存
密钥备份
由于主密钥并不会导入 Yubikey 、同时子密钥导入 Yubikey 后无法取出,为了妥善保存主密钥和备份子密钥,可以当对密钥对进行导出备份。
使用明文导出全部密钥对的公钥到 gpg-public.asc 文件
1 |
gpg --armor --export Hash/UID > gpg-public.asc |
使用明文导出全部密钥对的私钥到 gpg-secret.asc 文件
1 |
gpg --armor --export-secret-keys Hash/UID > gpg-secret.asc |
使用明文导出指定子密钥对的公钥到 gpg-public-sub1.asc(子密钥对十六位 ID 后面加一个感叹号)
1 |
gpg --armor --export ID! > gpg-secret-sub-1.asc |
导入 Yubikey
首先需要对 Yubikey 的 GPG 接口进行初始化设置
插入 Yubikey ,使用编辑卡片命令进入卡片,提权,并使用密码设置命令重置 PIN 码、 PUK 码和 Reset 码,默认 PIN 码为123456,默认 PUK 码为12345678
1 2 3 |
gpg --edit-card admin passwd |
使用 url 命令可设定公钥 url 地址,设定完成后,可使用 fetch 快捷导入公钥,公钥文件需注意使用 UTF-8 编码,公钥文件需注意使用 UTF-8 编码,公钥文件需注意使用 UTF-8 编码
使用 name 命令可修改 Yubikey 的持卡人姓名
设置完成后退出,使用主密钥对的 hash 字符串 或者 UID 来对主密钥对进行编辑,依次使用 key [序号] 选中和反选子密钥,使用 keytocard 导入 Yubikey
1 2 3 4 5 6 7 8 9 10 11 |
gpg --expert --edit-key Hash/UID key 1 keytocard ... key 1 key 2 keytocard ... key 2 key 3 keytocard |
备份完成、导入完成后,可使用命令删除本地私钥、公钥
1 2 |
gpg --delete-secret-keys Hash/UID gpg --delete Hash/UID |
删除完成后,插入 Yubikey 进入卡片使用 fetch 应当可以获取到公钥,如果出现错误,检查公钥 url 和公钥文件
1 2 3 |
gpg --edit-card fetch list |