我有一个父安装程序包,比如说,Parent.unsigned.mpkg
我想用 OS X 签名productsign
。
该文件Parent.unsigned.mpkg
包含名为A.pkg
,B.pkg
和的子包C.pkg
,它们依次安装 Clang 编译的命令行二进制文件和bash
包装脚本:
./Parent.unsigned.mpkg/Contents/Packages/A.pkg
./Parent.unsigned.mpkg/Contents/Packages/B.pkg
./Parent.unsigned.mpkg/Contents/Packages/C.pkg
我注册了一个 Mac 开发者帐户,该帐户设置(在其他证书中)带有 ID 的开发者 ID 安装程序证书ABCD1234
(此 ID 实际上与我的 Apple ID 不同且特定于我的 Apple ID。)我使用该security
工具获取此 ID 值:
$ security find-certificate -a -c "Developer ID Installer" | grep "alis"
"alis"<blob>="Developer ID Installer: Foo B. Baz (ABCD1234)"
我使用此 ID 值对这些子包中的每一个进行签名,这似乎毫无意外地进行:
$ productsign --timestamp --sign ABCD1234 ./Parent.unsigned.mpkg/Contents/Packages/A.pkg ./Parent.unsigned.mpkg/Contents/Packages/A.signed.pkg
...
$ productsign --timestamp --sign ABCD1234 ./Parent.unsigned.mpkg/Contents/Packages/B.pkg ./Parent.unsigned.mpkg/Contents/Packages/B.signed.pkg
...
$ productsign --timestamp --sign ABCD1234 ./Parent.unsigned.mpkg/Contents/Packages/C.pkg ./Parent.unsigned.mpkg/Contents/Packages/C.signed.pkg
...
然后,我将这些签名的子包移回其原始文件名:
$ mv ./Parent.unsigned.mpkg/Contents/Packages/A.signed.pkg ./Parent.unsigned.mpkg/Contents/Packages/A.pkg
$ mv ./Parent.unsigned.mpkg/Contents/Packages/B.signed.pkg ./Parent.unsigned.mpkg/Contents/Packages/B.pkg
$ mv ./Parent.unsigned.mpkg/Contents/Packages/C.signed.pkg ./Parent.unsigned.mpkg/Contents/Packages/C.pkg
当我尝试productsign
使用父包时,我收到以下警告消息:
$ productsign --timestamp --sign ABCD1234 ./Parent.unsigned.mpkg ./Parent.signed.mpkg
productsign: preparing "Parent.unsigned.mpkg" for signing ...
productsign: Using timestamp authority for signature
productsign: warning: component package "A.pkg" not found inside "Parent.unsigned.mpkg" and must be signed explicitly
productsign: warning: component package "B.pkg" not found inside "Parent.unsigned.mpkg" and must be signed explicitly
productsign: warning: component package "C.pkg" not found inside "Parent.unsigned.mpkg" and must be signed explicitly
productsign: Wrote signed product archive to ./Parent.signed.mpkg
当我尝试验证安装程序是否已签名时,我收到一条拒绝消息:
$ spctl -a -v --type install ./Parent.signed.mpkg
./Parent.signed.mpkg: rejected
未签名的安装程序可以正常工作,但它需要绕过 OS X Gatekeeper。因此安装程序包和内容似乎是正确的(或至少可以正常工作)。
我缺少哪些步骤或程序来生成与 OS X Gatekeeper 一起使用的数字签名安装程序?