代码签名与公证
签名用来证明安装包来自某个开发者,并且内容在签名之后没有被改动。公证是 Apple 额外的恶意软件扫描。两者都发生在把应用发给用户之前。
macOS
发给 Mac 用户的应用使用 Developer ID Application 证书签名,并开启强化运行时(Hardened Runtime)。公证用 notarytool 把包提交给 Apple,通过后用 stapler 把票据订到包上,离线也能通过 Gatekeeper。
没有公证的应用,用户打开时会看到“无法验证开发者”。签名顺序是先内层二进制和动态库,最后签外层 .app。原生模块也要签进去。
自动更新要求新旧版本使用同一张证书。更换证书后,旧版本可能无法自动替换到新包。
Windows
代码签名证书用来降低 SmartScreen 的拦截。普通 OV 证书需要积累下载信誉;EV 证书通常一开始就有信誉。签名时带上时间戳服务器,证书过期后,已经发出的签名仍然有效。
和 Fuses 的关系
Fuses 写在可执行文件里。有人替换 app.asar 时,签名校验和 ASAR 哈希可以让被改过的包无法启动。签名不能防止别人阅读 asar 里的源码。