个人身份认证 (PIV) 是由美利坚合众国政府标准定义为FIPS 201的工具。PIV 使用智能卡储存用于签名和加密的密钥。PIV 主要用于非 web 的场景。
以上用户指导由 yubico-piv-tool
version 2.2.1, ykman
version 4.0.7 以及 opensc
version 0.22.0 under Linux 所编写。
通常来讲,在您使用 Canokey 的 PIV 之前,您应该初始化 Cardholder Unique Identifier (CHUID) 以及 Cardholder Capability Container (CCC)
yubico-piv-tool -r canokeys -a set-ccc
yubico-piv-tool -r canokeys -a set-chuid
您可以使用 yubico-piv-tool
或 ykman
。
yubico-piv-tool
在本例中,我们使用 NIST P-384 算法生成密钥。私钥保存在 Canokey 中,公钥将写入 public384.pem
。
$ yubico-piv-tool -r canokeys -s 9a -a generate -A ECCP384 -o public384.pem
Successfully generated a new private key.
然后为该密钥生成证书。我们以 SSH 密钥为例,将证书导出为 cert.pem。
$ yubico-piv-tool -r canokeys -a verify-pin -a selfsign-certificate -s 9a -S "/CN=SSH key/" -i public384.pem -o certificate.pem
Enter PIN:
Successfully verified PIN.
Successfully generated a new self signed certificate.
然后我们就可以导入证书。
$ yubico-piv-tool -r canokeys -a import-certificate -s 9a -i certificate.pem
Successfully imported a new certificate.
如果您想验证密钥是否存在,可以通过以下方式进行验证
$ yubico-piv-tool -r canokeys -a read-certificate -s 9a
ykman
可适用于ykman
version 4.0 或以上版本。同样地,我们可以生成一个与 NIST P-384 algorithm 密钥对。此公钥将被写进 public384.pem
.
$ ykman -r canokeys piv keys generate -a ECCP384 9a public384.pem
然后为该密钥生成证书。证书将保存在 Canokey 中,因此无需像使用 yubico-piv-tool
那样再次导入。以 SSH 密钥为例,证书有效期为 3 年(-d 1095
)。
$ ykman -r canokeys piv certificates generate -d 1095 -s "CN=SSH Key" 9a public384.pem
要在 Canokey 上验证您的证书,您可以尝试
$ ykman -r canokeys piv info
使用 pkcs11 提供程序运行 ssh-agent
。这里我们使用 OpenSC。在下面的示例中,OpenSC 库位于 /usr/lib64/opensc-pkcs11.so。
$ eval $(ssh-agent -P /usr/lib64/opensc-pkcs11.so)
Agent pid 61757
接着通过以下代码添加密钥
$ ssh-add -s /usr/lib64/opensc-pkcs11.so
Enter passphrase for PKCS#11:
Card added: /usr/lib64/opensc-pkcs11.so
现在您可以检查您的 SSH 公钥。
$ ssh-add -L
ecdsa-sha2-nistp384 AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBDydOf6U+9/hAknZnJckyFwoinXKVEjTZkVV7bKNDZs4XsaHUoQix3z3+LsVn9WsLKeAKtigv2GS/removed/Snip12345678901234567890123456789012/SnipSnip== PIV AUTH pubkey
用你喜欢的方式将打印好的密钥添加到远程机器上。现在,你可以像往常一样 ssh 到远程计算机。
如果没有 ssh-agent,每次 ssh 访问机器时都需要输入 PIV pin。
检查 SSH 公钥
ssh-keygen -D /usr/lib64/opensc-pkcs11.so -e
接着以您喜欢的方式将公共密钥添加进您的远程操控机器。现在通过提供PKCS#11库ssh到您的远程操控机器。
$ ssh -I /usr/lib64/opensc-pkcs11.so remote.lan
Warning: Permanently added 'remote.lan' (ED25519) to the list of known hosts.
Enter PIN for 'SSH key':
X11 forwarding request failed on channel 0
Last login: Thu Jan 20 22:57:23 2022 from 192.168.1.246
[user@remote ~]$
为了在 Windows 上使用 PIV SSH ,您可以尝试
在 Windows 上使用 PIV SSH, NIST P-256
和 NIST P-384
可能会不兼容。如果您依旧无法通过以上两种方法找到您的公钥,请使用RSA2048
.
.pfx
密钥&证书.pfx
文件 可能同时包含私钥和证书。在此次试例中,我们将导入 credential.pfx
到9d
位置。
$ yubico-piv-tool -r canokeys -a verify-pin -s 9d -i "credential.pfx" -K PKCS12 -a import-key -a import-cert
如果您的 PIN 和 PUK 都被封锁无法使用的情况下,您可以使用yubico-piv-tool -r canokeys -a reset
已重置 PIV 小程序。在重置后,所有的 PIV 数据都已从您的 Canokey 抹除。以及您的 PIN, PUK 都已被恢复成默认状态。在重置过后请记得再次初始化的 PIV.