2

我有一个父安装程序包,比如说,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

我正在使用此处此处列出的 Apple 说明。

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

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

4

1 回答 1

7

我曾经Packages.app创建包项目。

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

productsign然后我如上所述通过命令行继续执行这些步骤,除了我只需要签署父pkg文件来生成一个工作的、签名的安装程序(我没有签署子包)。

使用pkgutil --flatten尝试mpkg在命令行上扁平化捆绑输出最终损坏了安装程序——我不得不将项目类型从内部更改BundleFlat内部Packages.app并在该应用程序中重建安装程序,并在外部签署扁平安装程序文件Packages.app

于 2015-02-08T05:44:53.440 回答