用 macOS Secure Enclave 守护 SSH Keys
Protecting SSH Keys with macOS Secure Enclave

我一直对 SSH Keys 的安全性感到焦虑,它们通常只靠文件权限保护,一旦系统被恶意脚本入侵,密钥就会轻易泄露。在尝试了 1Password、Bitwarden 和 YubiKey 后,我决定探索 macOS 原生的 Secure Enclave 方案。通过 sc_auth 命令,我可以将私钥直接生成并锁定在 Secure Enclave 硬件中,确保密钥永不离开芯片,且每次 SSH 连接都必须通过 Touch ID 验证。虽然该方案在安全性上无懈可击,但原生的 Touch ID 提示界面显得粗糙且不够友好,这让我最终考虑转向 Secretive 等第三方工具来优化体验。
我真正想要的是硬件级安全,私钥必须绝对无法被提取,即使我的 Mac 被完全攻陷也不行。
HN 评论区
121- database64128
像这样的安全功能确实有效,直到它失效为止。
当我在 macOS 上安装 WireGuard 时,我很高兴地发现它将私钥存储在系统钥匙串中。访问私钥需要 Touch ID。
然而有一天,系统升级后,WireGuard 应用在启动时崩溃了,报错如下:
[APP] Unable to open config from keychain: -25300
随后,该应用删除了所有配置文件,因为它们都被标记为“孤儿”,据称是为了“钥匙串一致性”[0]。
从那以后,我只用文本编辑器编辑 WireGuard 配置文件,然后导入到应用中。这个 bug 至今仍未修复 [1]。
[0] https://github.com/WireGuard/wireguard-apple/commit/dfb685f2...
[1] https://www.reddit.com/r/WireGuard/comments/wyt828/osx_wireg...
- jwr
几年前我就决定,要用一个独立于当前所用机器厂商的硬件设备来保护我的密钥。我还希望拥有备份密钥,并能自由地在不同物理位置间移动它们,或者在必要时让备份从世界另一端寄给我。
YubiKey 是唯一符合这些要求的解决方案,所以我选择了它。过去十年左右我一直在使用,对这套方案非常满意。参见 https://github.com/drduh/YubiKey-Guide,了解如何让存储在 YubiKey 上的 RSA 密钥同时用于 GPG 和 SSH。
- flexorium
多年来我一直都是 Secretive 的满意用户,包括用它进行 Git 提交签名——它会为签名生成一个独立的密钥,需要交互确认,但拉取/推送操作则不需要。我觉得这种权衡对 GitHub.com 来说非常理想,而对于服务器,我则使用其他配置不同的密钥。
明文存储的 SSH 密钥是 bagel [0] 最初关注的重点之一,bagel 是我们开发者端点秘密检测工具。后来我们将 bagel 作为库嵌入到了我们的开发者端点保护方案 [1] 中。
- mavam
代理开发(agentic development)的一个根本问题是:访问安全隔区(Secure Enclave)中的密钥需要人工在场。如果你以无头模式(headless)运行且未登录,Secretive(不确定其他工具是否如此)将无法访问安全隔区,即使你只选择了“通知”而非