如何将 productsign 与包含较小签名 pkg 文件的 mpkg 一起使用?
How to use productsign with mpkg containing smaller signed pkg files?
我有一个名为 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 为 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
.
外签署平面安装程序文件
我有一个名为 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 为 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
.