我要如何确认一个 macOS 安装程序的 pkg 文件是否已经被公证?是否有一个命令行工具可以做到这一点?
很遗憾,这里有不止一个正确答案。
认证过程是通过将文件包、应用或二进制文件上传到苹果服务器来完成的。苹果会对其进行验证。如果基础格式支持,您可以下载该“票证”并“附加”它。值得注意的是,即使未附加票证,它也会被认证。Gatekeeper会在运行时与苹果服务器进行验证。
您可以使用staple
命令检查是否已附加了票证。但是,您可以使用spctl
获得更广泛的答案,以确定Gatekeeper是否会接受它。
还有一个问题——2019年8月之前注册的Apple开发者帐户不需要经过认证就可以使用(至少在Mojave上是如此)。这可能会让人感到非常困惑,难以判断情况。
以下是一些未签名、已签名和已认证的二进制文件示例。这里没有使用任何票证。
使用几年前注册的苹果开发者帐户。Gatekeeper检查不需要认证:
$ spctl -a -vvv -t install go-hello-unsigned
go-hello-unsigned: rejected
source=no usable signature
$ spctl -a -vvv -t install go-hello-signed-oldapple
go-hello-signed-oldapple: accepted
source=Developer ID
origin=Developer ID Application: Example Inc (oldapple)
$ spctl -a -vvv -t install go-hello-notarized-oldapple
go-hello-notarized-oldapple: accepted
source=Notarized Developer ID
origin=Developer ID Application: Example Inc (oldapple)
使用更新的苹果开发者账户。需要遵守公证要求:
$ spctl -a -vvv -t install go-hello-unsigned
go-hello-unsigned: rejected
source=no usable signature
$ spctl -a -vvv -t install go-hello-signed-newapple
go-hello-signed-newapple: rejected
source=Unnotarized Developer ID
origin=Developer ID Application: Kolide, Inc (newapple)
$ spctl -a -vvv -t install go-hello-notarized-newapple
go-hello-notarized-newapple: accepted
source=Notarized Developer ID
origin=Developer ID Application: Kolide, Inc (newapple)
更新
现在Catalina已经发布,情况有所改变。签名密钥的年龄影响Mojave。Catalina现在要求所有内容都必须经过公证。
stapler validate
将执行此操作 -
$ stapler validate myfile.pkg
Processing: myfile.pkg
The validate action worked!
如果打印出 The validate action worked!
,则指定的pkg文件已经通过了公证。
如果打印出 does not have a ticket stapled to it.
,则指定的pkg文件未被公证,或公证过程中没有进行stapling步骤。