macOS 上怎么检查一个应用有没有正确签名?

用 codesign 和 spctl 判断一个 macOS 应用的签名是否有效、有没有被改动、能否通过 Gatekeeper 检查。

macOS门禁公证签名codesign 代码签名安全审计中风险
先对应用包运行 codesign 的详细查看,它会立刻告诉你应用是有开发者 ID 签名、只是 ad-hoc 签名,还是完全没有签名。

快速开始

macOS 打不开某个应用,多半和代码签名有关:应用没有签名、签名之后被改动过,或者签名身份不被 Gatekeeper 信任。下面几条命令可以把这几种情况区分开,并判断问题出在签名本身还是 Gatekeeper 策略上。

症状

?应用在程序坞里弹一下就退出,或者弹出“无法打开,因为无法验证开发者”“应用已损坏,无法打开”之类的提示;命令行工具则直接被杀掉或报权限错误。

查看应用的签名与签名身份

先把应用包的签名信息打印出来,一眼就能看出它到底有没有签名、由哪个开发者 ID 和团队签名。如果 Authority 一栏是 ad-hoc 或者干脆没有这一行,说明这个应用从来没有被正确签名,问题不在 Gatekeeper,而在签名本身。把示例路径换成你要检查的应用:直接从访达把应用拖进终端窗口,就能粘贴出完整路径。

在终端查看 Mac 上任意应用的签名者、TeamID、CDHash 和权限声明。

命令
$ codesign -dv --verbose=4 /Applications/Safari.app

校验签名有没有被改动过

上一步只是列出签名信息,这一步才会真正用密码学校验整个签名以及包内的每一个文件。如果没有任何输出,说明签名完好。如果报错指向某个具体文件,或者提示 “code object is not signed at all”,说明应用在签名之后被修改过,或者根本没有签名。路径沿用上一步检查过的那个应用包。

检查应用包的签名是否有效、是否在签名后被修改过。

命令
$ codesign --verify --deep --strict --verbose=2 /Applications/SomeApp.app

让 Gatekeeper 给出裁定结果

真正拦截启动的是 Gatekeeper 的判断,它会因为 codesign 看不到的原因拒绝应用,比如缺少公证票据。加上详细输出的参数运行评估,就能拿到确切原因,例如 source=no usable signature,或者显示来源是 Developer ID。应用路径同样沿用上一步。

spctl 会按 macOS 的 Gatekeeper 策略评估任意应用,并告诉你接受或拒绝的具体原因。

命令
$ spctl --assess --verbose /Applications/SomeApp.app

为这个应用单独添加一条 Gatekeeper 例外

如果你信任这个应用,但它没有签名,或者用的签名身份 Gatekeeper 不接受,那就针对它单独加一条评估规则,而不是把整个 Gatekeeper 关掉。把 /Applications/MyTool.app 换成你刚才检查的那个应用包,label 取一个好记的名字,方便以后识别。这样应用可以启动,其他应用仍然照常接受评估。

spctl --add 会添加按应用的评估规则,让某一个工具可以启动,同时 Gatekeeper 对其他软件保持严格。

命令
$ sudo spctl --add /Applications/MyTool.app --label "Approved Tools"
▾ 撤销
撤销
$ sudo spctl --remove /Applications/MyTool.app

确认 Gatekeeper 仍在正常执行策略

添加例外不应该把 Gatekeeper 关掉,所以再确认一次总开关状态。正常结果应显示 assessments enabled;如果显示 disabled,请先把总开关打开再继续。之后从访达打开刚才的应用,应该不会再被拦下。

用 spctl --status 查看 macOS 对下载应用的验证机制(门禁)当前是否启用。

命令
$ spctl --status
▾ 撤销
撤销
$ sudo spctl --global-enable
!不要把 Gatekeeper 长期关闭。例外规则应逐个应用添加,改完后再检查一次总开关状态;全局关闭评估会让任何未签名的应用都能运行。

如何确认已解决

codesign --verify 没有任何输出,spctl --assess 显示 accepted,从访达双击应用可以正常打开。

一键全部撤销

上面每一条命令都可以撤销。按此顺序执行即可全部还原。

一键全部撤销
$ sudo spctl --global-enable
sudo spctl --remove /Applications/MyTool.app

执行前请先确认——部分步骤之间可能并非相互独立。

来源

最后验证: 2026-09-22

相关指南