使用 Yubikey 登录 SSH

FIDO/U2F OpenSSH

FIDO/U2F 在 OpenSSH 8.2 中得到支持。新增了 ed25519-skecdsa-sk 两种密钥类型。需要 Client 和 Server 的版本同时为 8.2 以上才能使用1

什么是可发现密钥

FIDO/U2F OpenSSH密钥由两部分组成,在认证时组合起来响应质询:

  • 私钥句柄Key Handle,默认储存在硬盘的文件之中

  • 认证器Authencator设备私钥,独有且无法导出

如果认证器需要在不同的设备上使用,可发现密钥 需要额外拷贝私钥句柄,相对麻烦。

通过 FIDO2 常驻密钥2 的特性,将私钥句柄存放到认证器的内存区域中,需要使用时从设备中下载。

由于将密钥的两部分都放在认证器中,增加了认证器被盗时,密钥被盗用的可能。因此,使用此功能时,认证器必须设置有PIN,并且下载私钥句柄前需要输入。

如何操作

如果希望使用 可发现密钥 的特性,且认证器支持

# 在认证器中生成
# -O resident 表示密钥应存储在认证器本身,更多选项见 ssh-keygen(1) manual
ssh-keygen -t ed25519-sk -O resident

# 一些认证器可能不支持 ED25519,可改用
# ssh-keygen -t ecdsa-sk -O resident

# 临时从认证器中加载 私钥句柄 到 SSH agent
ssh-add -K

# 从认证器中下载私钥句柄到文件
ssh-keygen -K

# 移动到OpenSSH默认加载路径
mv ./id_ecdsa_sk_rk ~/.ssh/id_ecdsa_sk
# 可选,保存一下公钥
mv ./id_ecdsa_sk_rk.pub ~/.ssh/id_ecdsa_sk.pub

否则

ssh-keygen -t ed25519-sk
# ssh-keygen -t ecdsa-sk

其他问题

  1. Windows OpenSSH Client 需要使用 8.9.0.0以上,可以 前往 PowerShell/Win32-OpenSSH 下载并更新。并且需要在管理员模式下运行下载密钥的命令。

其他方法

  • 可以将 gpg-agent 用于 SSH认证,即使用GPG的子密钥认证。

  • 可以使用PIV(用户证书),通过证书及对应私钥进行验证


  1. https://www.openssh.com/txt/release-8.2 ↩︎

  2. FIDO Resident Keys;已在新的 WebAuthn 与 FIDO CTAP 中被重命名为 可发现凭据 (Discoverable Credentials) ↩︎