答案是:用终端命令codesign -dv --verbose=4检查签名元数据,重点看Authority(应为Developer ID或Apple Distribution)、TeamIdentifier(非空)、valid on disk(yes);再用spctl --assess确认公证状态是否accepted,并验证证书链完整性。

macOS 的软件签名策略不是摆设,而是系统拦截“已损坏”“开发者未知”类提示的底层逻辑。验证签名不能只看有没有,得看是否有效、是否公证、是否被系统信任。
怎么看一个 App 有没有合法签名
最直接的方式是用终端命令查签名元数据:
- 打开终端,运行:codesign -dv --verbose=4 "/Applications/YourApp.app"
- 重点看三行:Authority(应为 Developer ID Application: XXX 或 Apple Distribution: XXX)、TeamIdentifier(非空且匹配开发者账号)、valid on disk(必须为 yes)
- 若 Authority 显示 adhoc、unidentified developer 或为空,说明签名缺失或使用了非法证书
为什么有签名还会被拦?公证(Notarization)很关键
从 macOS 10.15(Catalina)起,仅带 Developer ID 签名不够,还必须通过苹果公证服务。未公证的应用在 Ventura 及更新版本中默认无法运行(尤其 Intel Mac):
- 检查是否含公证票证:xattr -pl com.apple.quarantine "/Applications/YourApp.app",有 ticket=1 表示曾获取过公证信息
- 更准确判断是否被系统接受:spctl --assess --type execute --verbose=4 "/Applications/YourApp.app",输出含 accepted 才真正过关
- 若显示 rejected,可能是公证已过期、证书被吊销,或应用提交后被苹果拒绝
签名有效 ≠ 证书可信:证书链要完整
签名本身有效,不代表系统能信任它。苹果要求整个证书链必须可追溯至其根证书(Apple Root CA),中间不能断链或过期:
- 运行:codesign --display --requirements - "/Applications/YourApp.app",查看 designated requirement 字符串是否规范
- 再执行:codesign --display --entitlements - "/Applications/YourApp.app" 2>/dev/null | plutil -convert xml1 - -o -,确认 entitlements 配置合理,无高危权限滥用
- 若证书过期、被撤销,或中间 CA 缺失,即使签名存在,Gatekeeper 也会拒绝运行
用户端快速验证技巧
不打开终端也能初步判断:
- 右键 → “打开”:触发 Gatekeeper 实时检查,弹窗若写“已验证来自‘XXX’的 App”,说明签名和公证都通过;若按钮灰掉或提示“无法验证开发者”,基本可判定签名异常
- 系统设置 → 隐私与安全性 → 点击“任何来源”下方的“详细信息”,能看到最近被拦截的 App 名称及拦截原因(如“未公证”“签名无效”)
- xattr -l "/Applications/YourApp.app" 查看所有扩展属性,重点关注 com.apple.quarantine 和 com.apple.security.cs.* 类字段,它们反映系统对应用的信任状态


















