ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

用 Secure Enclave 保护 SSH 密钥:Secretive 的存储、认证与使用全解析

用 Secure Enclave 保护 SSH 密钥:Secretive 的存储、认证与使用全解析 桌面应用应用安全密码学【免费下载链接】secretiveProtect your SSH keys with your Macs Secure Enclave项目地址https://gitcode.com/gh_mirrors/se/secretive点击查看免费下载Secretive 是一款面向 macOS 的 SSH 密钥管理与签名工具核心思路是把私钥交给 Mac 的 Secure Enclave安全隔区硬件保管私钥永不落盘、永不导出同时通过 Touch ID、Apple Watch 等强访问控制来约束密钥的使用并在每次签名时向你发出通知。本文基于仓库 README.md 展开结合 SecureEnclaveStore.swift 等源码讲解它的安全模型、安装方法、密钥创建选项、SSH agent 工作链路、智能卡支持以及常见排障与安全要点读完后你可以完整评估并在自己的 Mac 上落地这套方案。Secretive 是什么把 SSH 私钥交给硬件隔离层传统上SSH 私钥以文件形式保存在磁盘上如~/.ssh/id_ed25519靠文件权限保护。只要攻击者拿到文件读取权限私钥就可能被复制和滥用。Secretive 改变了这个模型密钥由 macOS 的 Secure Enclave 协处理器生成和保管操作系统与用户拿到的只是它的不透明表示真正的密钥材料不可导出。用项目文档的原话来说Its impossible to export them, by design——由于 Secure Enclave 的硬件约束私钥在物理上就无法被导出这从架构层面消灭了私钥文件被拷贝这一类风险。在 SECURITY.md 中作者进一步给出了三条设计原则难以泄露Hard to LeakSecretive 只操作硬件托管的密钥应用自身也读不到私钥明文即使存在 bug 也很难导致密钥被分享。简单与可审计Simplicity and Auditability刻意不无限堆砌功能保证代码库规模可控、用户可以合理审计。零第三方依赖Dependencies除构建过程外App 本身不依赖任何第三方代码从源头规避供应链攻击。Secretive 由两个主要部分组成一个是用户可见的管理界面 App另一个是后台的 SecretAgent 进程。Agent 以 SSH agent 的形式监听 Unix socketgit/ssh等客户端通过SSH_AUTH_SOCK环境变量找到它并请求签名签名请求再被转交给对应密钥所在的 StoreSecure Enclave 或智能卡执行。为什么选择它四大核心能力更安全的存储Safer Storage磁盘上的私钥文件即便权限设置正确也挡不住恶意软件直接复制。Secure Enclave 的密钥由于不可导出天然具备无法被偷走的属性。在源码层面SecureEnclaveStore.swift 的saveKey注释明确说明存进 Keychain 的Dataisnotactual key material. This is an opaque data representation that the SEP can manipulate——即只是安全隔区可操作的不透明表示而非可复用的私钥数据。强访问控制Access ControlSecure Enclave 支持 macOS 的强认证机制Touch ID、Apple Watch或密码。你可以在创建密钥时指定使用前必须通过 Touch ID或 Apple Watch认证这样即使恶意进程拿到了签名权限也无法在你不授权的情况下使用密钥。每次使用都有通知Notifications密钥被访问时 Secretive 会弹出系统通知你永远不会对密钥的使用毫不知情。通知机制由SigningWitness协议驱动——在 SigningWitness.swift 中它定义了签名前的拦截钩子speakNowOrForeverHoldYourPeace和签名后的记录钩子witnessAgent 在真正执行签名前后都会调用它。智能卡同样支持Support for Smart Cards Too没有 Secure Enclave 的旧款 Mac可以改用智能卡如 YubiKey来完成同样的硬件签名。这一能力由 SmartCardStore.swift 实现它通过TKTokenWatcher监听智能卡插入/拔出并用 Keychain 的kSecAttrTokenID查询卡上的私钥执行签名。工作原理从 SSH 客户端到 Secure Enclave 的完整链路1. SSH agent 与 socketSecretive 的 SecretAgent 进程在Sources/SecretAgent/AppDelegate.swift中装配SocketController在指定路径创建 Unix socket正式构建为socket.ssh调试构建为socket-debug.ssh见 URLs.swift客户端通过SSH_AUTH_SOCK指向该路径。SocketController负责接受连接并为每个连接建立独立Session同时用SigningRequestTracer追踪是哪个进程发起的请求来源溯源。2. Agent 解析请求并匹配密钥Agent.swift 是 SSH agent 协议的实现核心它处理两类主要请求requestIdentities枚举当前可用的身份公钥返回给客户端枚举时还会附带证书certificates身份signRequest解析待签名数据、识别目标SSH 连接或 SSH 签名按 key blob 匹配到对应密钥然后调用sign。sign方法同文件 L148-L166的执行顺序是先通过witness?.speakNowOrForeverHoldYourPeace通知即将使用密钥再调用store.sign(...)真正签名最后通过witness?.witness记录一次访问。这正好对应了使用前可拦截、使用后留通知的体验。3. 签名落在硬件上Secure Enclave 的签名实现在 SecureEnclaveStore.swift 的sign方法中先用SecItemCopyMatching从 Keychain 取出密钥的不透明表示再交给 CryptoKit 的SecureEnclave.P256.Signing.PrivateKey或 macOS 26 上的MLDSA65/87在安全隔区内完成签名密钥明文始终不进入应用内存。如果密钥配置了认证要求这里会创建LAContext触发 Touch ID / Apple Watch 弹窗如果此前已通过临时授权persistAuthentication机制持久化了认证则会复用已存在的认证上下文避免短时间内反复弹窗。4. 密钥的存储抽象源码中SecretStore协议SecretStore.swift统一了不同后端的操作接口sign签名、persistAuthentication持久化授权、reloadSecrets重新加载可修改型SecretStoreModifiable还支持create/delete/update。Secure Enclave 与智能卡分别是它的两个实现界面层面对用户暴露统一的密钥概念这就是为什么你能在同一界面管理两种来源的密钥。安装与快速开始方式一直接下载从项目的 Releases 页面下载最新的.zip包解压后把Secretive.app拖入应用程序文件夹即可。由于构建是可审计的见下文安全模型一节你还可以把下载包的 SHA 与构建日志中记录的 SHA 核对后再运行。方式二Homebrewbrew install secretive让 SSH 客户端认识 AgentSecretive 依赖SSH_AUTH_SOCK环境变量被客户端正确尊重。git和ssh命令行工具原生支持该变量安装后它们会自动通过 Agent socket 完成签名但部分第三方 Git GUI 客户端需要手动配置环境变量才能工作。若遇到Secretive 在我的 git 客户端里不生效的情况先确认客户端是否透传了SSH_AUTH_SOCK仓库 FAQ 中也给出了针对多种客户端的配置说明见 FAQ.md。代码签名与 Keychain 的注意点README 特别提醒虽然密钥由 Secure Enclave 保护但密钥的存取仍依赖 Keychain API。Keychain 会把密钥的读取权限限制在创建它的 App具体到 bundle ID。因此如果你从源码自行构建 Secretive必须保持 bundle ID 前后一致仓库根目录提供了 configure_team_id.sh 帮助配置否则 Keychain 将无法定位到你之前创建的密钥同理用自编译版本也无法读取预编译版本创建的密钥。密钥创建与访问控制选项在 Secretive 中新建密钥时可以指定两项核心配置对应源码中的Attributes结构CreationOptions.swift配置项可选值说明算法/密钥类型ecdsa256、ecdsa384、mldsa65、mldsa87、rsa2048由KeyType定义Secret.swift认证要求notRequired/presenceRequired/biometryCurrent决定使用密钥前是否需要认证算法支持的真实边界需要特别澄清的是Mac 的 Secure Enclave 只支持 256 位 EC 密钥因此 Secretive 无法生成 RSA 密钥FAQ 明确说明。从 SecureEnclaveStore.swift 的实现看Secure Enclave Store 实际可用的是ecdsa256另在 macOS 26 及以上额外支持mldsa65/mldsa87不满足系统版本时界面会把它们列为不可用并标注macOSUpdateRequired原因。ecdsa384与rsa2048等类型仅存在于KeyType定义层Secure Enclave 侧并不支持。如果你的场景必须使用 RSA需要通过智能卡如 YubiKey或其他工具满足。三种认证要求的行为差异notRequired无需认证使用密钥不弹窗。创建时对应的SecAccessControlCreateFlags只包含.privateKeyUsage。presenceRequired用户在场使用前需要通过生物识别、已配对的 Apple Watch 或密码认证。对应.userPresence标志是用前必须验身的默认推荐档。biometryCurrent仅当前生物特征只接受创建时刻录入的那组生物特征例如某个特定指纹新增任何指纹都会导致该密钥彻底无法访问且无法用密码绕过。源码注释直接将其标注为a dangerous option prone to data loss——配置此选项前必须向用户充分警告。另外注意Attributes.authentication只是创建时记录的一份描述修改它并不会真正改变密钥的认证行为——真正的约束由创建时写入 Keychain 的SecAccessControl决定。指定公钥路径从 Secretive 2.2 起每个密钥都会在磁盘上自动生成一份公钥文件表示其路径显示在 App 的 Public Key Path 字段。生成逻辑见 URLs.swift公钥文件按 OpenSSH MD5 指纹去掉冒号命名存放在PublicKeys目录下。你可以把该路径写进~/.ssh/config指定某个主机使用这把密钥Host myserver IdentityFile /path/to/xxx.pub智能卡YubiKey 等的使用对于没有 Secure Enclave 的 Mac可以插入智能卡并直接用于签名。实现上SmartCardStore.swift 通过TKTokenWatcher监听令牌插入事件并主动排除名为setoken的 Secure Enclave 令牌插入后以kSecAttrTokenID为条件从 Keychain 查询卡上的私钥用SecKeyCreateSignature执行签名。由于智能卡私钥由卡片本身保护创建/导出策略取决于卡厂商软件——部分卡片是可能通过厂商工具导出私钥的这与 Secure Enclave 的绝对不可导出不同。常见使用场景与 FAQ 要点密钥能导入导出吗Secure Enclave 密钥不行不能导入旧密钥也不能导出。换新 Mac 时直接为新机器创建一套新密钥即可README Backups and Transfers to New Machines 一节明确说明。智能卡密钥则视厂商软件而定有可能导出。支持 SSH Agent Forwarding 吗支持。在~/.ssh/config中为相关主机加上Host remotehost ForwardAgent yes之后在远程主机上使用你的任一密钥都必须经过本机 Secretive 的认证远程主机无法独立使用你的密钥。设置了 Apple Watch 却仍弹密码按 FAQ 的排查步骤先在系统设置 → 触控 ID 与密码或旧版系统偏好设置 → 安全性与隐私中开启使用 Apple Watch 解锁 App 和 Mac然后至少完成一次锁定并解锁 Mac让手表同步生效之后密钥被访问时会在手表上弹出确认双击侧边按钮即可批准。为什么有时弹出密码而非生物识别通常是认证上下文被降级例如 Touch ID 连续失败或系统策略限制此时 macOS 会退回密码输入。若该密钥创建时选择的是biometryCurrent则密码无法作为替代手段。我可以生成 RSA 密钥吗不能理由同上Secure Enclave 仅支持 256 位 EC 密钥。若必须用 RSA请使用智能卡方案。安全模型与可审计构建安全策略详细策略见 SECURITY.md核心包括前文提到的硬件密钥不可读、代码简单可审计、零第三方依赖三大原则。受支持版本为 Releases 页面的最新版本发现漏洞请通过 GitHub 的私有报告Private Reporting渠道提交。可审计的构建过程从 Secretive 3.0 开始所有发布版均由 GitHub Actions 构建并使用 GitHub Artifact Attestation 对构建产物做签名背书。每条构建都有完整可审计的构建日志记录源码来源与产物的 SHA 值你可以在关于About窗口找到构建日志链接把自己下载的 zip 的 SHA 与日志中的 SHA 比对确认你运行的就是日志中记录的产物。这是零第三方依赖原则在分发环节的延伸。那一次对 GitHub 的网络请求是什么Secretive 会在启动时检查更新UpdaterUpdater.swift默认以 24 小时为周期含 1 小时容差调用 GitHub 的 releases API用语义化版本比较选出高于当前版本、非预发布、且最低系统版本 ≤ 当前系统的最新版本并提示。你可以在关于窗口中点击检查更新手动触发对某个版本点忽略后它的名字会被记入com.maxgoedjen.Secretive.updater.ignorelist这个 UserDefaults但关键安全更新critical无法被忽略。故障排查与卸载通用排障流程在终端执行ssh -Tv gitgithub.com检查是否通过SSH_AUTH_SOCK连上了 Secretive 的 Agent。若之前正常、现在突然失效先尝试菜单栏帮助Help→ Setup Secretive重新走一遍设置流程。若仍有问题把ssh -Tv的输出连同问题描述一起反馈给维护者。卸载方式将Secretive.app拖入废纸篓并删除容器目录~/Library/Containers/com.maxgoedjen.Secretive.SecretAgent。注意 SecretAgent 进程可能在你退出 App 或重启前仍在后台运行需要手动结束或重启系统。小结Secretive 把SSH 私钥保护这件事从文件权限提升到了硬件隔离层面Secure Enclave 保证密钥不可导出访问控制保证密钥不被偷用通知机制保证每次使用都可感知智能卡支持则补全了旧设备的可选路径。对于希望深度审计或自行构建的用户整个项目管理界面、Agent、协议层、两种 Store 实现都在本仓库内可直接查阅且除构建过程外不依赖任何第三方代码。若你重视 SSH 密钥的物理级安全与使用透明度Secretive 是一套架构清晰、可验证的实践方案。赞分享桌面应用应用安全密码学【免费下载链接】secretiveProtect your SSH keys with your Macs Secure Enclave项目地址https://gitcode.com/gh_mirrors/se/secretive点击查看免费下载相关推荐Secure Enclave终极安全指南如何用Secretive保护你的SSH密钥Secure Enclave终极安全指南如何用Secretive保护你的SSH密钥 Secretive是一款专为macOS设计的安全工具通过利用Mac的Se桌面应用应用安全密码学Secretive 常见问题深度解析Secure Enclave 保护 SSH 密钥的实用排障指南Secretive 常见问题深度解析Secure Enclave 保护 SSH 密钥的实用排障指南 Secretive 是一款用 Mac 的 Secure E桌面应用应用安全密码学AVR-HAL外设驱动实战I2C、SPI与UART通信接口开发指南AVR HAL外设驱动实战I2C、SPI与UART通信接口开发指南 AVR HAL是为AVR微控制器提供embedded hal抽象的强大框架让开发者能够轻嵌入式上一篇GitHubDaily开源奖项申请与获得行业认可的技巧下一篇终极SublimeLinter完全指南如何轻松实现代码质量革命创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表