Yubikey 使用 PIV 自动登录 SSH

以下步骤是利用 Yubikey 的 PIV 功能实现自动登录 SSH ,不要和 Yubikey 的另一个功能 OpenPGP 搞混了,OpenPGP 也能实现自动登录 SSH

工具

YubiKey Manager

YubiKey Manager 是 Yubico 官方的一款 GUI 工具用以管理配置 Yubikey

ykman(推荐)

yubico-piv-tool 是 Yubico 出的专门用于配置 piv 的 cli 工具,但现在已经过时了更推荐使用 ykman ,该工具随 YubiKey Manager 一起安装但更加强大,能配置 Yubikey 所有功能,默认安装在 C:\Program Files\Yubico\YubiKey Manager\ykman.exe

0. PIN

Yubikey PIV 的默认 PIN 配置如下,如果有改动,则某些步骤可能会要求输入相应的 PIN,

  • PIN:123456
  • PUK:12345678
  • Management Key:010203040506070801020304050607080102030405060708

1. 私钥

a. 自己生成私钥后导入 Yubikey

使用 openssl 生成 ECC NIST P-256 私钥

openssl ecparam -name prime256v1 -genkey -noout -out key.pem

以下命令向 Yubikey 中 9a 插槽导入私钥

ykman piv keys import 9a -

回车后,将上一步生成的私钥输入,保证最后有空行

然后 ctrl+c ,接着输入 PIN(默认是 123456)

b. Yubikey 自行生成

在 9a 这个插槽上生成 ECC NIST P-256 密钥对

ykman piv keys generate -a ECCP256 9a -

输入 PIN (默认是 123456)后将直接显示公钥

2. 公钥

以下命令将显示 9a 这个插槽上的公钥

ykman piv keys export 9a -

3. 证书

a. Yubikey 自签名证书

ykman piv certificates generate -s foobar 9a -

-s: 证书的 CN 属性,可随意设定

输入 PIN(默认是 123456)回车后,接着输入公钥,保证最后有空行,再然后 ctrl+c

b. CSR 证书请求文件

以下命令将为 9a 插槽生成 CSR 文件

ykman piv certificates request -s foobar 9a - -

输入 PIN(默认是 123456) 回车后,接着输入公钥,保证最后有空行,再然后 ctrl+c,将直接显示 CSR 文件内容。有了 CSR 文件,接下来的流程就和申请 ssl 证书一样。区别是,不一定要申请能被系统信任的证书。如果有私钥则可以用私钥生成自签名证书,否则可以先生成自签名 CA 证书,在用该 CA 给 CSR 生成证书。

以下命令导入证书

ykman piv certificates import 9a -

输入证书,保证最后有空行,然后 ctrl+c,接着输入 PIN(默认是 123456)

4. SSH公钥

至此,我们已经有了 ECC NIST P-256 密钥对和证书,以下命令可以查看当前同时具有密钥和证书的插槽

ykman piv info

先将之前的公钥转换成 SSH 公钥,再写进目标的 .ssh/authorized_keys

ssh-keygen -i -m PKCS8 -f public.pem

-f: ssl 公钥文件路径

5. SSH自动登录

a. OpenSC

OpenSC 实现了标准 PIV 的接口。通过该工具,其他软件便能访问 Yubikey 了。

  • Xshell 配合 OpenSC

  • 原版 putty 并不支持使用 PIV ,但修改版 PuTTY-CAC 支持,需要在 PuTTY-CAC 的 pagent 中设置 openSC 的 dll

b. WinCryptSSHAgent(推荐)

该工具同时模拟了市面上常见的 agent ,例如 xagetn(xshll)、pagetn(putty)、ssh-agent... 所以只要开这一个,就相当于开启了多个不同的 agetn,因此不可再开启其他的 agetn 以免冲突。同时该软件不依赖 OpenSC,但需要安装好 Yubikey 的智能卡驱动。启动后,右键托盘图标,点击Show Public Keys 就能看到 SSH 公钥。