macos应用数字签名是gatekeeper验证起点,需同时满足签名有效、证书可信、完成公证、文件未篡改四条件,缺一即触发“无法验证开发者”警告或阻止运行。

macOS 应用数字签名不是“加个章”就完事,而是 Gatekeeper 安全机制启动验证的起点。用户双击打开时,系统会立刻检查签名有效性、证书可信度、是否公证、文件是否被篡改——四者缺一不可。验证失败就会弹出“无法验证开发者”或直接阻止运行。
一、确认应用是否已签名且签名有效
这是最基础也最关键的一步。签名缺失或损坏,后续所有验证都无从谈起。
- 终端执行:codesign -dv --verbose=4 "/Applications/YourApp.app"(路径替换成实际路径)
- 重点看三项输出:Authority(应为“Developer ID Application: XXX”)、valid on disk(值必须是 yes)、Notarized(若为 yes 表示已公证)
- 若提示 “code object is not signed at all”,说明完全未签名;若 “valid on disk: no”,说明应用内容已被修改,签名失效
二、检查开发者证书是否安装正确且受信任
签名依赖本地钥匙串中的证书和私钥。证书过期、被吊销、未安装到正确钥匙串,或缺少 WWDR 中间证书,都会导致验证失败。
- 终端运行:security find-identity -v -p codesigning,确认列表中存在你的 Developer ID 证书,且状态非 EXPIRED
- 打开“钥匙串访问”,切换到“登录”钥匙串,在“我的证书”里找到对应证书,双击展开,确认“信任”设置为“使用此证书时,始终信任”
- 若证书显示“此证书不受信任”,需手动下载并安装 Apple 的 WWDR 证书(可在 Apple 官网搜索 “Apple Worldwide Developer Relations CA”)
三、验证公证票据是否已嵌入并生效
自 macOS 10.14.5 起,仅签名不够,必须完成公证(notarization)并把苹果签发的票据 stapled 到应用中,否则在 Catalina 及更新系统上会被拦截。
- 检查票据是否存在:xattr -pl com.apple.quarantine "/Applications/YourApp.app",输出含 ticket=1 表示票据已缓存
- 验证公证结果:spctl --assess --type exec --verbose=4 "/Applications/YourApp.app",返回 accepted 才代表签名+公证全部通过
- 若返回 source=Unnotarized 或 rejected,需重新提交 notarytool 公证,并用 xattr -w com.apple.security.assessment.ticket 命令 stapling 票据
四、排查常见干扰因素
有时签名和公证都正确,但验证仍失败,问题往往出在环境层面。
- 系统时间偏差:证书有效期严格依赖时间戳。进入“系统设置 → 通用 → 日期与时间”,开启“自动设置日期与时间”
- Gatekeeper 策略被重置:终端执行 spctl --status 查看是否启用;如关闭,运行 sudo spctl --master-enable 恢复
- 下载来源标记残留:应用若从网络下载,系统会打上 quarantine 属性。可临时移除测试:xattr -d com.apple.quarantine "/Applications/YourApp.app"(仅调试用,不建议分发前移除)











