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
2
3
4
5
6
7
8
9
10
11
12
13
Please select what kind of key you want:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
(7) DSA (set your own capabilities)
(8) RSA (set your own capabilities)
(9) ECC and ECC
(10) ECC (sign only)
(11) ECC (set your own capabilities)
(13) Existing key
(14) Existing key from card
Your selection?

选择8或11(出于兼容性问题建议8)

1
2
3
4
5
6
7
8
9
Possible actions for a RSA key: Sign Certify Encrypt Authenticate
Current allowed actions: Sign Certify Encrypt

(S) Toggle the sign capability
(E) Toggle the encrypt capability
(A) Toggle the authenticate capability
(Q) Finished

Your selection?

先后输入S E 关闭主密钥的签名、加密功能,仅剩下Certify功能

此时显示Current allowed actions: Certify

输入Q 保存

1
2
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (3072)

设定密钥长度,安装个人喜好即可,最长支持4096

1
2
3
4
5
6
7
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0)

设定有效期,0 为无限期

1
2
3
4
5
6
7
8
9
10
11
12
13
Key is valid for? (0) 0
Key does not expire at all
Is this correct? (y/N) y

GnuPG needs to construct a user ID to identify your key.

Real name: Acha666
Email address: [email protected]
Comment:
You selected this USER-ID:
"Acha666 <[email protected]>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit?

接下来输入你的姓名、邮箱,Comment注释可不填,最后输入O 确认

等待密钥生成,期间会要求设定一个密码来保护私钥

1
2
3
4
5
public and secret key created and signed.

pub rsa4096 2021-07-09 [C]
D37707A72D1D0B214CA3A1DA47E55EC6BE69F5F4
uid Acha666 <[email protected]>

完成后,记下密钥指纹的后8位,比如这里是BE69F5F4

也可输入gpg -k 查看存在的密钥

创建子密钥

输入gpg --expert --edit-key [你的密钥指纹后8位]

1
2
3
4
5
6
7
8
Secret key is available.

sec rsa4096/47E55EC6BE69F5F4
created: 2021-07-09 expires: never usage: C
trust: ultimate validity: ultimate
[ultimate] (1). Acha666 <[email protected]>

gpg>

输入addkey

1
2
3
4
5
6
7
8
9
10
11
12
13
14
gpg> addkey
Please select what kind of key you want:
(3) DSA (sign only)
(4) RSA (sign only)
(5) Elgamal (encrypt only)
(6) RSA (encrypt only)
(7) DSA (set your own capabilities)
(8) RSA (set your own capabilities)
(10) ECC (sign only)
(11) ECC (set your own capabilities)
(12) ECC (encrypt only)
(13) Existing key
(14) Existing key from card
Your selection?

选择8 (Yubikey新版才支持ECC密钥储存)

我们先创建用于加密的子密钥,像刚才一样进行调整,直到Current allowed actions: Encrypt ,输入Q保存

接下来设定长度、有效期,最后输入y确定,过程中会要求你输入刚刚设定的密码

1
2
3
4
5
sec  rsa4096/47E55EC6BE69F5F4
created: 2021-07-09 expires: never usage: C
trust: ultimate validity: ultimate
ssb rsa4096/C8FBF2621A50F1F9
created: 2021-07-09 expires: never usage: E

可以看到多出ssb一栏,就是生成的子密钥

接下来重复两遍操作,生成用于签名和认证的子密钥

1
2
3
4
5
6
7
8
9
sec  rsa4096/47E55EC6BE69F5F4
created: 2021-07-09 expires: never usage: C
trust: ultimate validity: ultimate
ssb rsa4096/C8FBF2621A50F1F9
created: 2021-07-09 expires: never usage: E
ssb rsa4096/AE5B1CEB405B6D82
created: 2021-07-09 expires: never usage: S
ssb rsa4096/BC9E54467EE12DFB
created: 2021-07-09 expires: never usage: A

最后输入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
2
3
4
.\ykman openpgp keys set-touch SIG FIXED
.\ykman openpgp keys set-touch ENC FIXED
.\ykman openpgp keys set-touch AUT FIXED
.\ykman openpgp keys set-touch ATT 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
2
3
4
git config --global user.signingkey [密钥ID]
git config --global commit.gpgsign true
git config --global user.email [对应的邮箱]
git config --global user.name [github]

完成后,在git commit时会自动进行签名,需要输入PIN和及时触碰Yubikey

PIV智能卡