硬件令牌(如YubiKey)不存储SSH私钥文件,而是将私钥始终保留在设备内部仅执行签名运算,确保私钥永不导出、不进内存、不落地;FIDO2密钥类型(sk-ed25519/sk-ecdsa)支持OpenSSH 8.2+原生调用,需物理触摸认证,可选PIN保护;HSM/PKCS#11方案适用于高合规场景,私钥不可导出且审计可追溯;必须同步禁用密码登录、禁用代理缓存、严格设文件权限,并绑定用途与有效期;常见误区包括误用HostKeyAgent、导出导入私钥、将HSM当作加密U盘。

硬件令牌(如 YubiKey、SoloKey、Nitrokey)不能“存储”SSH私钥文件,而是让私钥始终留在设备内部,仅在认证时执行签名运算——私钥永不导出、不进内存、不落地,这才是真正意义上的安全存储。
用 FIDO2 安全密钥实现物理级绑定
这是目前最主流、最易落地的方案,依赖 OpenSSH 8.2+ 原生支持的 sk-ed25519 或 sk-ecdsa 密钥类型:
- 运行
ssh-keygen -t ed25519-sk -f ~/.ssh/id_sk,插入 YubiKey 并轻触感应区,密钥对直接在芯片内生成 - 公钥(
id_sk.pub)可安全复制到服务器~/.ssh/authorized_keys,私钥永远不出令牌 - 连接时需物理触摸,防止远程静默签名;可选启用 PIN(固件 ≥5.4),进一步阻断无授权使用
- 不依赖 PKCS#11 或代理进程,OpenSSH 直接通过 libfido2 与设备通信,链路简洁可靠
用 HSM/PKCS#11 模块实现企业级密钥托管
适用于高合规要求场景(如金融、政务),强调密钥不可导出与审计可追溯:
- 用厂商工具(如
ykman或pkcs11-tool)调用 HSM 的 TRNG 生成 RSA-4096 或 EC-P384 密钥对 - 设置属性
CKA_PRIVATE=true且CKA_EXTRACTABLE=false,确保私钥无法被任何接口读取 - 在
~/.ssh/config中声明路径:IdentityFile "pkcs11:token=MyHSM;object=prod-admin" - OpenSSH 8.9+ 原生加载 PKCS#11 库(如
libykcs11.so),签名全程由硬件完成
必须同步落实的基础防护措施
仅靠硬件不等于安全,还需配套策略堵住旁路风险:
- 服务端禁用密码登录:
PasswordAuthentication no,并设AuthenticationMethods publickey防降级 - 本地禁用密钥代理缓存:
ForwardAgent no、AddKeysToAgent no,避免句柄被转发或驻留内存 - 严格控制私钥文件权限:
chmod 600 ~/.ssh/id_*,即使使用硬件,本地元数据文件也不应被读取 - 为每个密钥绑定用途与有效期:配合 SSH 证书机制,由 HSM 签发短期用户证书(如
-V +4h),而非长期固定密钥
常见误区提醒
有些做法看似增强安全,实则无效甚至误导:
- HostKeyAgent 不是有效配置项:sshd 不支持从 YubiKey 加载 Host Key,主机密钥必须本地文件,只能靠权限加固与轮换提升安全性
- 不要把私钥导出再“导入”令牌:YubiKey 等设备只支持在内部生成密钥,导出再导入会破坏安全模型
- HSM 不是加密 U 盘:它不提供“挂载后读取私钥文件”的能力,所有操作必须走标准密码接口(PKCS#11/FIDO2)

















