Yubikey关于GPG、SSH(Win下)、PIV、Windwos登录和FIDO2网站登录的教程
最近买了一个Yubikey 5 NFC,研究了不少时间,总算大致弄明白了
FIDO2 网站登录
可谓是最基础的用途了,放一个我找到的能支持的网站列表
- Microsoft个人账户(替代密码)
- Microsoft组织账户(替代密码)
需要先由管理员启用
- Github(2FA)
先添加一个2FA方式,再启用安全密钥
- Twitter(2FA)
- Cloudflare(2FA)
- Google(2FA)
GPG
GnuPG(GPG)是一个软件,可以用于文件、邮件和Commit等的加密、签名
Windows下:[Gpg4win]](https://gpg4win.org/download.html)
Centos: yum install gpg -y
Ubuntu: apt-get install gpg -y
建议阅读并了解:非对称加密算法、GPG简介:(简明 GPG 概念 - 知乎 (zhihu.com))
建议:你需要创建一个主密钥和3个子密钥,子密钥分别只有加密、签名和认证功能,主密钥仅有签发子密钥功能。操作完成后将主密钥离线保存,仅使用子密钥进行操作。
创建密钥
创建主密钥
Windows下cmd,Linux下Bash操作
gpg --expert --full-generate
输出:
1 | Please select what kind of key you want: |
选择8或11(出于兼容性问题建议8)
1 | Possible actions for a RSA key: Sign Certify Encrypt Authenticate |
先后输入S
E
关闭主密钥的签名、加密功能,仅剩下Certify
功能
此时显示Current allowed actions: Certify
输入Q
保存
1 | RSA keys may be between 1024 and 4096 bits long. |
设定密钥长度,安装个人喜好即可,最长支持4096
1 | Please specify how long the key should be valid. |
设定有效期,0
为无限期
1 | Key is valid for? (0) 0 |
接下来输入你的姓名、邮箱,Comment注释可不填,最后输入O
确认
等待密钥生成,期间会要求设定一个密码来保护私钥
1 | public and secret key created and signed. |
完成后,记下密钥指纹的后8位,比如这里是BE69F5F4
也可输入gpg -k
查看存在的密钥
创建子密钥
输入gpg --expert --edit-key [你的密钥指纹后8位]
1 | Secret key is available. |
输入addkey
1 | gpg> addkey |
选择8 (Yubikey新版才支持ECC密钥储存)
我们先创建用于加密的子密钥,像刚才一样进行调整,直到Current allowed actions: Encrypt
,输入Q保存
接下来设定长度、有效期,最后输入y确定,过程中会要求你输入刚刚设定的密码
1 | sec rsa4096/47E55EC6BE69F5F4 |
可以看到多出ssb一栏,就是生成的子密钥
接下来重复两遍操作,生成用于签名和认证的子密钥
1 | sec rsa4096/47E55EC6BE69F5F4 |
最后输入save保存并退出
将密钥转移到Yubikey
请注意:私钥一旦转移到Yubikey就会从电脑中被删除,且无法再被导出
可以先使用gpg --armor --export-secret-subkeys [你的密钥指纹后8位]
导出它(但不建议)
首先插入Yubikey,gpg --edit-card
使用admin
命令开启管理模式
默认PIN: 123456
默认Admin PIN: 12345678
分别设置PIN, Admin PIN 和 PUK
可以用name命令设置你的姓名,其他信息也可以设置
退出card-edit
模式,然后再gpg --expert --edit-key [你的密钥指纹后8位]
使用key 1
选择一号子密钥,被选中的密钥会被用ssb*
标记
输入keytocard
导入密钥,请务必在导入时注意选择正确的槽位(slot)
三个功能不同的密钥与三个不同槽位对应
然后用key 1
反选1号密钥,再对2号3号进行同样操作
导出主密钥
在私钥被转移后,你电脑中的私钥相当于一个指针,指向Yubikey中的私钥,每次调用私钥都需要插上智能卡并输入PIN,必要时需要按压金属部分
首先导出子密钥的指针gpg --armor --export-secret-subkeys BE69F5F4 > %userprofile%/Desktop/Secret_Subkeys
导出所有私钥gpg --armor --export-secret-keys BE69F5F4 > %userprofile%/Desktop/Secretkeys
导出公钥gpg --armor --export BE69F5F4 > %userprofile%/Desktop/Publickeys
完成后会在你的桌面生成三个文件
之后为了安全起见,请离线保存主密钥并从电脑中删除它
gpg --delete-secret-keys BE69F5F4
这会删除包括子密钥在内的所有私钥,所以你需要重新导入三个子密钥的指针
gpg --import [路径]
设置触摸
我们可以设置每次调用卡内私钥都需要触摸Yubikey,这需要你首先安装YubiKey Manager
首先进入安装目录
1 | cd "C:\Program Files\Yubico\YubiKey Manager" |
使用命令
1 | .\ykman openpgp keys set-touch SIG FIXED |
即可
每次操作时,Yubikey上的灯会闪烁,这时就需要触摸Yubikey
测试
Windows下可以使用自带的GUI客户端Kleopatra中的记事本
Linux下,使用gpg -r [密钥ID] -e [文件]
就可以使用公钥对文件加密,会生成一个.asc
文件
使用gpg -d [文件]
就可使用私钥解密文件
万一搞砸了… 重置Yubiikey
1 | .\ykman openpgp reset |
谨慎使用,会删除所有私钥并将密码恢复到初始状态
Commit 签名
进入Git Bash
Windows下的特殊设置:设置GPG程序地址
1 | git config --global gpg.program "/c/Program Files (x86)/GnuPG/bin/gpg.exe" |
设置签名密钥
1 | git config --global user.signingkey [密钥ID] |
完成后,在git commit
时会自动进行签名,需要输入PIN和及时触碰Yubikey