macOS 中的签名:身份、完整性与 Mach-O 格式
发布: (2026年3月1日 GMT+8 06:05)
4 分钟阅读
原文: Dev.to
Source: Dev.to
签名的三大支柱
macOS 代码签名不仅仅是一个数字“印章”。它是一个多层次的安全合约,直接嵌入到 Mach‑O(Mac 可执行文件格式)二进制中。
1. 封印(完整性)
当开发者对二进制进行签名时,codesign 工具会为可执行代码的每个“页”生成一个加密哈希(唯一指纹)。
- 检查: 程序加载到内存时,macOS 内核会不断重新计算这些哈希。
- “杀死”: 如果二进制的哪怕一位被修改(如十六进制编辑器、病毒或下载损坏),哈希就不再匹配签名。内核不会弹出提示,而是直接使用
SIGKILL终止进程。
2. 身份(信任)
签名标识了 谁 创建了代码。信任分为三个层级:
- Apple‑Signed: 核心系统组件。高权限。
- Developer ID: 由注册的 Apple 开发者(每年 $99)签名。可以进行 Notarized(由 Apple 服务器预先扫描恶意软件)。
- Ad‑hoc Signatures (
-): 没有经过验证的证书的签名。它表示“我将自己标识为此特定版本的代码,但我没有经过验证的身份”。在 Intel Mac 上,这是一系列系统级功能能够工作的最低要求。
3. 授权(许可单)
这是签名中最强大的部分。授权是嵌入的 XML “字典”,告诉系统该程序被允许执行哪些操作。
- Hardened Runtime: 在 macOS Big Sur 中引入,要求二进制在签名中显式“请求”权限(例如使用麦克风或加载第三方插件)。如果代码尝试执行未在授权列表中的操作,内核会将其关闭。
如何检查签名
你可以使用 codesign 工具查看 Mac 上任意二进制的签名“内部”信息:
codesign -dvv /path/to/binary
常见输出字段:
- Executable: 文件路径。
- Identifier: 应用的唯一字符串(例如
com.google.chrome)。 - CodeDirectory: 哈希版本和标志(例如
hardened)。 - Authority: 谁签名的(例如
Developer ID Application: Apple Inc.)。
为什么这很重要
对于开发者来说,签名系统是导致“在我的机器上可以运行”在共享二进制时常常失效的根本原因。没有有效的签名和正确的授权,你的代码不仅对 macOS 内核“未受信任”,而且实际上已经无法正常运行。
Installerpedia(可选工具)
如果你想更轻松地安装工具、库或整个代码仓库,可以考虑 Installerpedia,这是一个社区驱动的安装平台。
ipm install repo-name