标准的 SSH 密钥通常存放在 `~/.ssh/` 目录中,它们仅受文件权限保护,极易受到任何获得文件系统访问权限的恶意脚本的攻击。通过利用 macOS Secure Enclave,用户可以确保私钥永远不会以文件形式存在于内存或磁盘中,而是驻留在专门的安全芯片内,由该芯片内部执行签名操作。

一个请求 Touch ID 身份验证以执行安全操作的 macOS 系统提示。
原生 macOS 实现触发生物识别提示,以授权使用 Secure Enclave 密钥。gatezh.com

这张图片展示了使用硬件支持密钥的每次 SSH 身份验证所需的强制性 Touch ID 生物识别提示。

硬件支持的密钥隔离

Secure Enclave 是 Mac 芯片上的一个安全子系统,与主处理器隔离。当 SSH 密钥由此硬件支持时,私钥在 enclave 内部生成且永远不会离开。当发起连接时,Mac 会要求 enclave 对身份验证挑战进行签名,而实际密钥对操作系统保持不可访问。

秘密仓库统计: Star 9.3k; Watcher 53; Fork 232
秘密仓库统计github.com

HN Digest 根据 github.com 报告的数据绘制的图表;数值按原文显示。

这种方法解决了重大的安全漏洞:软件类解决方案(如加密保险箱)在运行时仍会将密钥解密到内存中。相比之下,Secure Enclave 确保即使操作系统被完全攻破,也无法“窃取”私钥,因为密钥材料从未暴露给主 CPU。

技术实现与配置

设置原生方法涉及使用 `sc_auth` 命令来创建 CryptoTokenKit 身份。用户必须指定 NIST P-256 曲线和 `bio` 标志以要求生物识别身份验证。此过程会生成一个“密钥句柄”——这是一个引用文件,告诉 SSH 客户端请求 enclave 提供签名,而不是读取原始私钥文件。

为了使系统正常运行,用户必须将 `SSH_SK_PROVIDER` 环境变量设置为指向 `ssh-keychain.dylib` 库。由于 SSH 不会自动发现这些特定的密钥句柄,因此必须在 `~/.ssh/config` 文件中明确定义它们,以确保系统优先使用 Secure Enclave 密钥而非标准的 RSA 或 Ed25519 密钥。

权衡与用户体验

这种高水平安全的主要权衡是缺乏可移植性。Secure Enclave 密钥与特定的 Mac 硬件绑定;如果设备损坏,密钥将丢失。用户必须维护一个备用密钥(例如存储在 YubiKey 或另一台机器上),以确保不会被锁在自己的服务器之外。

原生的 macOS 体验明显不够完善,它显示的是低级别的 'ctccardtoken' 提示,而不是标准的 SSH 界面。对于寻求更精致体验的用户,Secretive 等第三方应用程序提供了精美的 UI 和系统通知,同时仍利用相同的底层 Secure Enclave 硬件。

macOS 终端上低级别 'ctccardtoken' 提示的截图。
原生 macOS 体验包含用于 Secure Enclave 身份验证的低级别 'ctccardtoken' 提示。gatezh.com

此截图展示了原生 macOS 实现用于密钥身份验证的未经润色的低级别界面。

Mac 上 Secretive 应用程序界面的截图。
Secretive 为管理存储在 Secure Enclave 中的 SSH 密钥提供精美的用户界面。github.com

Secretive 是一个第三方应用程序,与原生实现相比,它提供了更精美的 UI 和系统通知。

Hacker News 读者的反应

  • 替代方案: 一位评论者分享了他们创建的工具,旨在简化那些偏好原生方法或熟悉 SeKey 的用户的操作流程。 评论 ↗
  • 质疑: 一位用户表示担忧,因为这不是一个文档化的功能,苹果可能会更改或移除该功能,从而导致用户无法访问其密钥。 评论 ↗
  • 亲身经验: 另一位评论者评论了历史上可靠地将硬件密钥作为 SSH 凭据的困难,并建议这项技术本应更早变得易于获取。 评论 ↗

以上为 Hacker News 讨论中观点的摘要,并非经过核实的事实。 阅读完整讨论 ↗