macos应用顺利运行需经三级校验:一为本地签名验证,检查签名有效性、证书状态及文件完整性;二为首次运行时的在线公证检查,核验notarization ticket有效性;三为离线票据验证,依赖装订票证实现断网可用。
macos 应用能顺利运行,背后不是一次简单的“验身份”,而是一套分阶段、有顺序、本地与云端协同的三级校验流程。签名只是起点,公证和装订才是闭环的关键。
第一关:本地签名验证(codesign)
用户双击应用时,系统立刻执行本地检查:
- 确认.app或.pkg中是否嵌入有效签名,证书是否由Apple颁发、未过期、未被吊销
- 逐字节比对所有可执行文件、资源、框架的哈希值,确保自签名后未被篡改
- 检查TeamIdentifier是否非空,Authority字段是否为Developer ID Application或Apple Distribution
任一失败,直接报错“已损坏,无法打开”——这不是系统刁难,而是签名本身已失效或不合规。
第二关:首次运行时的在线公证检查
仅当签名通过,系统才发起联网请求,向Apple服务器核验该应用是否完成公证:
- 检查签名中是否附带有效的Notarization Ticket(公证票证)
- 若票证存在且未被撤销,允许运行;若缺失或失效,弹出“无法检查是否含恶意软件”警告
- 该步骤只在首次从互联网下载后运行时触发,后续启动不再联网
这就是为什么有些应用第一次能开、重启后却打不开——它可能已公证但尚未装订,断网即失败。
第三关:离线票据验证(stapled ticket)
公证成功后,开发者必须将票证“装订”进应用包。此后系统无需联网即可完成最终判断:
- 执行spctl --assess --type execute /path/to/YourApp.app,返回空行即表示Gatekeeper全部通过
- 装订后的票证随应用分发,即使用户断网或Apple服务临时不可用,也能正常打开
- 未装订的已公证应用,在首次运行时仍依赖网络,稳定性差
很多开发者卡在这一步:公证通过了,但忘了xcrun stapler staple,导致用户端体验断裂。
签名 ≠ 可信:证书链与权限配置同样关键
签名有效,不代表系统信任它。还需满足:
- 整个证书链必须可追溯至Apple Root CA,中间不能断链或过期
- entitlements配置需合理,避免高危权限滥用(如accessibility、screen capture等)
- 系统时间必须准确,否则时间戳校验失败,哪怕证书本身有效也会被拒
- 钥匙串中对应证书权限需设为“允许所有应用程序访问此项目”,否则签名操作可能静默失败
这些细节不显眼,却常是“无法验证开发者”提示的真实原因。











