双击macos应用提示“已损坏”或“开发者未知”是因签名验证失败;需用codesign -dv验证valid on disk、authority和notarized三项,再用spctl --assess确认gatekeeper评估结果,并通过xcrun stapler validate检查公证票证一致性。

当你双击一个从网页下载的 macOS 应用却弹出“已损坏”或“开发者未知”提示时,问题往往就出在签名验证失败——终端命令能直接读取签名元数据,快速确认它是否由合法证书签发、文件是否被篡改、是否通过苹果公证。
查看应用完整签名信息
打开终端,输入以下命令(把 【Safari.app】 替换为你想查的实际应用名,例如 Postman.app 或 Visual Studio Code.app):
codesign -dv --verbose=4 "/Applications/Safari.app"
输出中必须盯住三项:valid on disk(值为 yes 才表示文件未被篡改)、Authority(应显示类似 Apple Distribution: Apple Inc. 或 Developer ID Application: Your Company LLC,若为 adhoc 或空白则签名无效)、Notarized(yes 表示已通过苹果公证;macOS Ventura 及更新系统对未公证的 Intel 应用默认拦截)。
注意:系统预装应用(如 Finder、Safari)不在 /Applications 下,而在 /System/Applications 或 /System/Library/CoreServices。先用 ps aux | grep -i "Safari.app" 查真实路径,再代入命令验证。
快速判断签名是否有效(无输出即正常)
方法一:执行简化命令
codesign --verify --verbose "/Applications/YourApp.app"
执行后完全没输出 → 签名有效、文件完整;若报错如 code object is not signed 或 invalid signature → 未签名、签名损坏或证书不可信。
方法二:检查 Gatekeeper 实际评估结果
spctl --assess --type execute --verbose=4 "/Applications/YourApp.app"
输出含 accepted 表示签名与公证均通过;若显示 rejected 或 invalid,说明系统明确拒绝运行——哪怕签名存在,也可能因证书吊销、时间戳失效或公证票证过期而失败。
确认公证票证是否内嵌
第一步:检查应用是否带 quarantine 属性
xattr -pl com.apple.quarantine "/Applications/YourApp.app"
若返回结果中含 ticket=1,说明系统曾从网络获取过公证信息;若无该字段或显示 ticket=0,则未完成公证流程。
第二步:提取并验证公证票证本身
xcrun stapler validate "/Applications/YourApp.app"
这一步会检查票证是否真实存在、是否过期、是否与当前文件哈希匹配。【若提示 “The staple and the app are inconsistent” 则说明票证已失效或被剥离,需重新公证并 stapler 重打】。











