macos应用提示“已损坏”或“开发者未知”通常因数字签名验证失败,需通过终端命令依次检查签名状态、apple公证、证书链完整性、本地证书匹配性及gatekeeper策略。

如果您下载了一个 macOS 应用,但双击后弹出“已损坏”“无法打开”或“开发者未知”的提示,这通常不是应用本身存在恶意代码,而是系统未能验证其数字签名。以下是检查应用安全签名的完整操作流程:
一、使用终端命令验证应用签名状态
该方法通过 macOS 内置的 codesign 工具直接读取应用包的签名元数据,判断签名是否存在、是否有效、是否被篡改。
1、打开“终端”应用(可通过聚焦搜索输入“终端”并回车启动)。
2、输入以下命令并回车,将 /Applications/YourApp.app 替换为实际应用路径:
codesign -dv --verbose=4 /Applications/YourApp.app
3、观察输出中 Authority 字段:若显示 “Developer ID Application: XXX” 或 “Apple Distribution: XXX”,说明签名有效;若显示 “adhoc”、“unrecognized” 或字段为空,则签名缺失或异常。
4、检查 TeamIdentifier 是否存在且非空,该值是苹果分配给开发者的唯一标识,缺失表明未使用合法证书签名。
二、检查应用是否通过 Apple 公证(Notarization)
公证是 Gatekeeper 在 macOS 10.15 及以后版本中强制要求的安全增强环节,未公证的应用即使有 Developer ID 签名,也可能被拦截。此步骤验证应用是否已提交至 Apple 并获得官方背书。
1、在终端中执行以下命令,确认应用是否包含公证票证:
xattr -pl com.apple.quarantine /Applications/YourApp.app
2、若返回结果中含 ticket=1 或类似标记,说明系统曾从网络获取过公证信息;若无该字段或显示 ticket=0,则未完成公证流程。
3、进一步验证公证状态,执行:
spctl --assess --type execute --verbose=4 /Applications/YourApp.app
4、若输出含 accepted,表示签名与公证均通过;若显示 rejected 或 invalid,说明公证失败或已被撤销。
三、验证签名证书链完整性
签名有效性不仅取决于证书存在,还依赖整个证书链可追溯至苹果信任根。此步骤检测证书是否过期、被吊销,或中间证书缺失。
1、在终端中运行:
codesign --display --requirements - /Applications/YourApp.app
Python Mac版 为 Python.org 官方提供的 Python 3.14.6 macOS 11 及以上安装包,适合在macOS环境中安装、运行 Python 代码并学习函数、模块和脚本开发。
2、记录输出中的 designated requirement 字符串,该字符串定义了系统接受该应用所需的全部签名条件。
3、执行证书链提取命令:
codesign --display --entitlements - /Applications/YourApp.app 2>/dev/null | plutil -convert xml1 - -o -
4、检查输出中是否有 com.apple.security.get-task-allow 等调试权限字段——若存在且未被移除,可能表明应用为开发测试版,不具备分发资格。
四、比对系统可用签名证书与应用签名匹配性
该方法用于确认本地钥匙串中是否存在与应用签名相匹配的有效开发者证书,排除因证书未安装或已过期导致的验证失败。
1、在终端中列出当前所有可用于签名的证书:
security find-identity -v -p codesigning
2、观察输出中是否包含与应用签名中 Authority 字段一致的证书条目,例如 “Developer ID Application: Ledger SAS (ABC123XYZ)”。
3、若列表中显示 EXPIRED 或无对应条目,说明本地缺少有效签名证书,应用签名将无法被系统信任。
4、如需进一步确认证书有效期,复制证书哈希(如 ABC123XYZ),执行:
security find-certificate -p -p -t "ABC123XYZ" | openssl x509 -noout -dates
五、检查 Gatekeeper 当前策略是否覆盖该应用类型
Gatekeeper 策略决定系统对不同来源应用的拦截强度。此步骤确认当前设置是否允许运行来自互联网的已签名应用,避免因策略过于严格导致误拦。
1、在终端中查询当前 Gatekeeper 状态:
spctl --status
2、若返回 assessments enabled,表示 Gatekeeper 正常启用;若为 disabled,则签名检查机制已关闭,所有拦截均非签名问题所致。
3、查看具体允许来源策略:
spctl --master-enable && spctl --list --enable
4、确认输出中是否包含 developer-id 和 mac-app-store 类型;若仅显示 mac-app-store,则来自互联网的已签名应用将被阻止。










