跳转到内容

安全钥匙(FIDO)

FIDO 密钥是一种私钥留在硬件安全钥匙(USB 或 NFC 令牌)里的 SSH 密钥。私钥从不以软件形式存在,既不在你的设备上,也不在钥匙串里。每次连接都由钥匙硬件在你实体触碰之后完成签名。

  • 一把支持 USB 或 NFC 的 FIDO2 安全钥匙。
  • 服务器运行 OpenSSH 8.2 或更高版本sk- 类密钥自该版本引入)。

安全钥匙只能在 SigilTTY 内新建,无法导入在别处用 ssh-keygen -t ecdsa-sk 生成的密钥对——那些密钥绑定的是另一个应用身份,拿到这里也签不了名。

在密钥库中选择创建 FIDO 密钥,然后设置:

  • 名称——这把密钥在密钥库和服务器配置选择器中的显示名。
  • 存入安全钥匙(驻留)——可选。驻留凭据本体存进令牌,而不是仅在钥匙串里留一个句柄。
  • 要求 PIN——除触碰之外,再向安全钥匙索要 PIN 码。

随后 Mac 或 iPhone 会弹出系统的安全钥匙面板。插入或贴近钥匙,触碰它,如果设了 PIN 就再输入 PIN。

在密钥库中复制公钥,像添加其他公钥一样追加到服务器的 ~/.ssh/authorized_keys。它是一行标准的 OpenSSH 公钥:

sk-ecdsa-sha2-nistp256@openssh.com AAAA… name@SigilTTY

开启要求 PIN 后,复制出来的行会带上 verify-required 选项,它让服务器拒绝任何未经 PIN 确认的签名:

verify-required sk-ecdsa-sha2-nistp256@openssh.com AAAA… name@SigilTTY

「要求 PIN」之后仍可在密钥的编辑面板里随时开关,但改完要重新复制公钥并更新服务器,否则服务器仍按旧设置执行。

签名按连接逐条发生,无法缓存——以下每一项都需要触碰一次:

  • 打开一个终端会话;此后每次重连再触碰一次。
  • 打开 SFTP 文件浏览器;首次传输文件时再触碰一次(传输走自己的连接)。
  • 打开隧道会话。
  • 跳板机链路上的每一跳(若该跳使用这把密钥)。
  • Mac 上批量连接时的每一台服务器——系统面板会逐个弹出。

取消系统面板等同于认证失败:会话会挂起等待,且不会自行重试。

FIDO 密钥特意不参与以下几处:

  • 密钥接力(Key Handoff)——没有可交付的私钥。请在另一台设备上使用同一把安全钥匙,或再登记一把。
  • 代理转发——FIDO 密钥不会作为可转发身份提供给远程主机。
  • **生物识别保护**与密码短语——触碰本身已是持有证明,因此这些选项对 FIDO 密钥隐藏。
  • 导入既有的 *-sk 密钥文件,以及把密钥导出到 SigilTTY 之外。

凭据句柄像其他凭据一样存放在钥匙串里,因此启用凭据同步后会随 iCloud 钥匙串传输——但单凭句柄签不了任何东西。你从哪台设备连接,那把安全钥匙就得在哪台设备上在场。详见 iCloud 同步

安全钥匙的各类报错,请参见身份验证失败