在 macOS 上使用 Touch ID 设置 SSH 密钥
2026年10月19日 在这篇文章的第一部分,我将展示一种简单且安全的方式在 Mac 上创建 SSH 密钥(包含支持 GitHub 的 3 个命令)。在第二部分,我将深入探讨并解释对于好奇的读者来说,实际发生了什么。Mac 擁有一个内置的所谓安全隔 enclave ,在这里我们可以创建“身份”,这些身份是无法被窃取的(除非您可能与某个国家的敌人交恶)。这些身份通过 Touch ID 进行保护,并可用于 SSH 身份验证。使用这些身份而不是传统的 SSH 密钥文件有几个重要优势:私密材料无法提取、从不显示、无法被窃取,一旦身份被使用就会提示您,不会有密钥文件(如 ~/.ssh/id_ed25519.pub 等)遍布文件系统,也没有意外删除它们的风险。这种额外的安全性将在您使用 SSH 时生效,包括像 GitHub 这样的 git-over-ssh 服务。很高兴某些最广泛分发的计算机默认可以使用先进的安全技术!几年前,像这样的东西只能在 CERN 或者丹·布朗的小说中找到。让我们看看如何在您的消费级 Mac 上进行设置。人机接口的设计必须易于使用,以便用户可以例行且自动地正确应用保护机制。Saltzer 和 Schroeder,"计算机系统中信息的保护" 快速设置 我们将在安全隔 enclave 上创建一个安全身份,然后告诉 SSH 如何使用它进行身份验证,最后将密钥添加到 GitHub。 步骤 1:创建您在此 Mac 上使用的身份: sc_auth create-ctk-identity -l ssh-key -k p-256-ne -t bio # 运行一次以创建身份 您将被提示触碰“Touch ID”。您的身份现在已被创建并安全保存(下面的深入探讨中会解释参数)。 步骤 2:告诉 SSH 使用该身份(提示输入 PIN 时,直接按回车): ssh-add -K -S /usr/lib/ssh-keychain.dylib # 重启后运行 从这里起,SSH 将知道在通过 SSH 连接时使用安全隔 enclave 中的身份;它的记忆不太好,因此在重启后需要提醒它。 步骤 3:每当您需要将密钥注册到新服务器(如 GitHub)时,运行此命令: ssh-add -L # 在您需要公共密钥时运行 如果列出了多个身份,请使用以 sk-ecdsa-sha2-nistp256... 开头的那一行。这是可共享的身份句柄,也是 GitHub 会询问的 SSH 密钥。 ssh-add -L 的输出可以添加为 GitHub SSH 密钥 这就是您需要的超安全设置!新的身份现在可以与 SSH 一起使用,您将在身份验证过程中被提示输入 Touch ID: git push # 触发 Touch ID 提示 没有人可以窃取您的身份(好吧,您甚至无法自愿给予它,因为它无法从安全隔 enclave 中提取),但有了强大的能力等等:如果您的 Mac 死亡,身份也将死去,您需要重新创建一个(并在必要的地方重新注册,例如 GitHub)。在 git 尝试使用 SSH 进行身份验证时,您会收到 Touch ID 提示 如果您对这一过程的工作原理感到好奇,请继续阅读! 在幕后 我们现在将尝试理解在幕后发生的事情。我们将首先从安全隔 enclave 中实际创建身份开始,然后看看 SSH 如何通过 ssh-keychain.dylib 与安全隔 enclave 进行交互,最后试图了解完整的 SSH 登录流程中发生了什么。这是参考帖子(例如 arianvp 的这篇精彩调查)、手册和实验的结果。这些信息中有很多是未记录的,而这是我形成心智模型所需的最低信息,来确信它确实是可行的。下面一些命令输出的内容已进行了删除以便于阅读,如果您想要完整的体验,欢迎本地运行它们! 在安全隔 enclave 上创建身份 身份是通过 sc_auth 命令管理的(其中 sc_ 代表智能卡)。在苹果的术语中,它们被称为“CryptoTokenKit”身份,简称 CTK 身份。为什么不称为智能卡身份?什么是智能卡?没有概念!有很多奇怪的苹果词汇,但在实践中,它们只是存储在安全隔 enclave 上的私钥: $ sc_auth list-ctk-identities 密钥类型 公钥哈希 保护 标签 p-256-ne 458F712F281B53C683F23FC02E69D44DAFDAA3DE bio ssh-key 如果您跟随快速设置,您应该在这里恰好有一个身份,该身份是在您运行 sc_auth create-ctk-identity 命令时创建的。让我们更详细地看一下 create-ctk-identity 命令: sc_auth create-ctk-identity -l <标签> -k <密钥类型> -t <保护> 使用 p-256-ne 密钥类型时,此命令在安全隔 enclave 中创建身份——我猜测是通过首先收集一些熵,然后生成一些私钥材料,并分配所需的任何东西以便于记账,并确保只能通过您的指纹访问它。标签是自由文本。
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡