使用 PIV 和 PKCS#11 验证 SSH(客户端)

Yubikey 最酷的特性之一就是通过 PKCS#11 来验证 SSH。 把私钥存储在 Yubikey 上,无论在何时,当它被访问后都可以反馈你的操作。

除了常见的远程登录,所有通过 SSH 连接的操作(比如使用远程 git 服务器(比如 Github))都可以触发这一行为。这是客户端的保护手段,用来防止在未授权的情况下获取到 SSH 私钥。

需要注意的是,只有 RSA 密钥支持这种操作。

  1. 创建一对 2048-bit 的 RSA 钥匙串:

    1. yubico-piv-tool -s 9a -a generate -k --pin-policy=once --touch-policy=always --algorithm=RSA2048 -o public.pem

    输入你的 Yubikey 的 管理密钥

  2. 创建一个自签名证书(或者使用证书签名请求):

    1. yubico-piv-tool -a verify-pin -a selfsign-certificate -s 9a -S '/CN=ssh/' --valid-days=365 -i public.pem -o cert.pem

    输入 PIN 码然后触摸 Yubikey。

    或者用 selfsign-certificate 替代 request-certificate ,并把得到的 .csr 文件进行内部 CA 认证。

  3. 导入已(自)签名的证书:

    1. yubico-piv-tool -k -a import-certificate -s 9a -i cert.pem

    输入你的 Yubikey 的 管理密钥

  4. 以 OpenSSH 使用的正确格式导出存储在 Yubikey 上的公钥:

    1. ssh-keygen -D /usr/local/opt/opensc/lib/pkcs11/opensc-pkcs11.so -e

    或者,你也可以使用先前生成的公钥。

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

    你现在可以分享这个公钥用作 SSH 验证了(比如放在 ~/.ssh/authorized_keys)。

  5. 检查 9a 插槽的状态(可选):

    1. yubico-piv-tool -a status
  6. 通过 PKCS#11 添加私钥到本地 ssh-agent:

    1. ssh-add -s /usr/local/opt/opensc/lib/pkcs11/opensc-pkcs11.so

    当它询问密码时输入你的 Yubikey 的 PIN 码。

  7. 确定私钥已经被添加:

    1. ssh-add -L
  8. 或者,选择性的把 PKCS11Provider 添加到 ~/.ssh/config 中:

    1. Host github.com
    2. PKCS11Provider /usr/local/opt/opensc/lib/pkcs11/opensc-pkcs11.so
    3. Port 22
    4. User foobar