OpenSSH 8.2+原生支持FIDO2安全密钥认证,需生成ecdsa-sk或ed25519-sk密钥、部署公钥至authorized_keys,并确保客户端和服务端均满足版本及libfido2依赖要求。

OpenSSH 从 8.2 版本起原生支持 FIDO2 安全密钥(如 YubiKey、SoloKey、Nitrokey FIDO2)作为公钥认证的载体,无需额外代理或中间件。配置核心在于生成 FIDO2 兼容的 ECDSA-SK 或 Ed25519-SK 密钥,并在服务端正确部署公钥。
确认环境与版本要求
客户端和服务端均需 OpenSSH ≥ 8.2(推荐 9.0+),且系统支持 libfido2 库(多数现代 Linux 发行版默认包含)。macOS 12.3+ 自带兼容的 ssh-keygen;Windows 11 22H2+ 的 OpenSSH 客户端也支持 SK(Security Key)类型。
- 检查版本:
ssh -V输出应含OpenSSH_8.2p1或更高 - 验证 libfido2 是否可用:
ssh-keygen -D /usr/lib/libfido2.so(Linux 路径可能为/usr/lib/x86_64-linux-gnu/libfido2.so.1;macOS 通常无需指定) - FIDO2 密钥需已启用 PIN(部分型号首次使用需在 Yubico Manager 或 WebAuthn 页面设置)
生成并注册 FIDO2 密钥对
使用 ssh-keygen -t ecdsa-sk 或 -t ed25519-sk 命令生成密钥。ed25519-sk 更高效,ecdsa-sk 兼容性略广;两者均需物理按键确认。
- 基础生成(自动调用默认设备):
ssh-keygen -t ed25519-sk -f ~/.ssh/id_ed25519_sk -C "my-yubikey" - 指定设备路径(当系统识别多个 FIDO2 设备时):
ssh-keygen -t ecdsa-sk -O device=/dev/hidraw2 -f ~/.ssh/id_ecdsa_sk - 强制要求用户验证(需输入 PIN + 按键):
ssh-keygen -t ed25519-sk -O verify-required -f ~/.ssh/id_ed25519_sk - 生成后会输出公钥(
id_ed25519_sk.pub),内容以sk-ssh-ed25519@openssh.com开头,这是服务端唯一需要的部分
服务端配置与授权部署
服务端无需额外安装模块,仅需确保 PubkeyAuthentication yes 已启用(默认开启),且 OpenSSH 版本 ≥ 8.2。FIDO2 公钥按普通公钥方式写入 ~/.ssh/authorized_keys 即可。
- 将生成的
id_ed25519_sk.pub内容追加到目标用户的~/.ssh/authorized_keys(一行,不可换行) - 确保权限正确:
chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys - 重启 sshd 通常非必需,但若修改过
sshd_config中认证相关参数,建议执行sudo systemctl reload sshd - 测试连接:
ssh -o "IdentityAgent=none" -i ~/.ssh/id_ed25519_sk user@host(禁用代理避免干扰)
增强安全性与日常使用技巧
FIDO2 认证天然防钓鱼、防私钥泄露,但需注意策略细节才能发挥最大价值。
- 设置密钥 PIN:生成时若未设 PIN,后续无法启用
verify-required;可用ykman fido2 set-pin补设(需 YubiKey) - 限制使用场景:通过
ssh-keygen -O application=ssh:myserver.example.com绑定应用标识,提升隔离性 - 多密钥管理:不同服务器建议用不同密钥(不同
-C注释或-O application),避免单点失效 - 备份方案:FIDO2 密钥本身不可导出私钥,务必保留至少一个备用认证方式(如传统 SSH 密钥或密码)
整个流程不依赖第三方守护进程,密钥生命周期由硬件控制,私钥永不离开安全芯片。只要服务端 OpenSSH 版本达标,配置就是几条命令的事。

















