如何将 productsign 与包含较小签名 pkg 文件的 mpkg 一起使用?

How to use productsign with mpkg containing smaller signed pkg files?

我有一个名为 Parent.unsigned.mpkg 的父安装包,我想用 OS X productsign 签名。

文件 Parent.unsigned.mpkg 包含名为 A.pkgB.pkgC.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 为 ABCD1234 的 Developer ID Installer 证书(这个 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

我正在使用 Apple 概述的说明 here and here

未签名的安装程序可以正常工作,但它需要绕过 OS X Gatekeeper。所以安装程序包和内容似乎是正确的(或至少工作正常)。

我遗漏了哪些步骤或过程来生成与 OS X Gatekeeper 一起使用的数字签名安装程序?

我使用 Packages.app 创建了包项目。

Packages.app 内,我将项目类型从 Bundle 更改为 Flat 并重建了安装程序存档。

然后我通过命令行继续 productsign 步骤,除了我只需要签署父 pkg 文件来生成一个有效的、签署的安装程序(我没有签署儿童套餐)。

使用 pkgutil --flatten 尝试在命令行上拼合 mpkg 包输出最终破坏了安装程序——我不得不将项目类型从 Bundle 更改为 [= Packages.app 内的 13=] 并在该应用程序内重建安装程序,并在 Packages.app.

外签署平面安装程序文件