macos软件运行需经三级验证:一为本地签名验证,检查签名有效性与文件完整性;二为首次运行时的在线公证检查,确认票证有效;三为离线票据验证,依赖装订票证实现断网可用。

macOS 软件从用户双击打开到顺利运行,背后是一套分阶段、有先后顺序的自动验证流程。它不是“一次检查完事”,而是本地与云端协同、签名与公证联动的三级机制。
第一关:本地签名验证(codesign)
用户点击应用时,系统立即执行本地校验:
- 检查.app或.pkg中是否嵌入有效签名,确认签名证书是否由Apple颁发且未过期
- 逐字节比对所有可执行文件、资源、框架的哈希值,验证自签名后是否被篡改
- 若签名无效、证书不可信或文件损坏,直接报错“已损坏,无法打开”
第二关:首次运行时的在线公证状态检查(notarization check)
仅当签名通过,系统才会发起网络请求,向Apple服务器查询该应用是否已公证:
- 检查签名中是否附带有效的公证票证(Notarization Ticket)
- 若票证存在且未被撤销,允许运行;若无票证或票证失效,弹出“无法检查是否含恶意软件”警告
- 此步骤仅在首次从互联网下载后运行时触发,后续启动不再联网
第三关:离线票据验证(stapled ticket)
公证成功后,开发者需将票证“装订”(staple)进应用包。此后系统无需联网即可完成最终判断:
- spctl --assess --type execute /path/to/YourApp.app 返回空行,即表示通过Gatekeeper全部检查
- 装订后的票证随应用分发,即使用户断网或Apple服务临时不可用,也能正常打开
- 未装订的已公证应用,在首次运行时仍会尝试联网验证,失败则阻拦
关键细节提醒
三个环节缺一不可:
- 没签名 → 过不了第一关,提示“已损坏”
- 有签名但没公证 → 卡在第二关,提示“无法检查恶意软件”
- 已公证但没装订票证 → 首次运行依赖网络,不稳定;装订后才真正“闭环”
整个流程不复杂但容易忽略装订这一步。











