openssh 8.2+原生支持fido2密钥认证,需满足版本、内核模块、ctap2模式及设备权限要求;用ssh-keygen -t ecdsa-sk生成密钥,部署公钥至authorized_keys;服务端无需额外配置,客户端连接时自动触发触摸验证。

OpenSSH 8.2 及以上版本原生支持 FIDO2 安全密钥(如 YubiKey、SoloKey、Nitrokey FIDO2)作为公钥认证的载体,无需额外代理或中间件。关键在于正确生成密钥、配置服务端与客户端,并确保系统识别硬件设备。
确认环境与依赖
确保运行环境满足最低要求:
- OpenSSH ≥ 8.2(执行 ssh -V 查看版本;Ubuntu 20.04+、Debian 11+、CentOS Stream 9 默认包含)
- Linux 系统需启用 u2f-hidraw 或 hid-generic 内核模块(现代发行版通常已加载)
- FIDO2 密钥需处于“CTAP2”模式(YubiKey 5 系列默认支持;部分旧型号需用 ykman 工具启用)
- 用户有对 /dev/hidraw* 的读写权限(通常加入 dialout 或 plugdev 用户组即可)
生成并注册 FIDO2 密钥对
使用 ssh-keygen 直接生成兼容 FIDO2 的密钥,过程会触发密钥物理按键确认:
ssh-keygen -t ecdsa-sk -f ~/.ssh/id_ecdsa_sk -C "my-yubikey"
- -t ecdsa-sk 表示使用 ECDSA + FIDO2(也可选 ed25519-sk,但需密钥和 OpenSSH 均支持)
- -f 指定私钥路径(公钥自动保存为 id_ecdsa_sk.pub)
- 执行时将提示插入密钥并触摸感应区;若失败,检查 USB 连接、密钥是否被锁定或是否启用了 PIN(部分策略下需先设 PIN)
生成后,公钥内容(id_ecdsa_sk.pub 中以 sk-ecdsa-sha2-nistp256@openssh.com 开头的一行)需部署到目标服务器的 ~/.ssh/authorized_keys 中。
服务端配置(sshd)
OpenSSH 服务端默认允许 FIDO2 密钥,但需确认以下设置:
- 确保 /etc/ssh/sshd_config 包含:
PubkeyAuthentication yes
AuthorizedKeysCommand none(避免覆盖 FIDO2 公钥解析)
AuthenticationMethods publickey(可选,强制仅用公钥认证) - 无需修改 AuthorizedKeysCommand 或启用 PAM 模块——FIDO2 密钥验证由 sshd 内置完成,不依赖外部命令
- 重启服务:sudo systemctl restart sshd
客户端连接与故障排查
连接时使用标准命令,OpenSSH 自动识别并调用 FIDO2 流程:
ssh -i ~/.ssh/id_ecdsa_sk user@server.example.com
- 首次连接会提示“Confirm user presence for key”,需触摸密钥;后续会话若未超时(默认 15 分钟),可免触继续使用
- 常见问题:
- “invalid format” 或 “agent refused operation”:私钥文件权限过宽(应为 600),或公钥未正确写入 authorized_keys
- “no such identity”:检查私钥路径是否拼写正确,或是否在 ssh-agent 中添加了非 FIDO2 类型的同名密钥造成干扰
- 无反应 / 超时:运行 ls /dev/hidraw* 确认设备节点存在;用 sudo libfido2-tools 中的 fido2-token -L 检测密钥是否被识别










