我有一个名为Parent.unsigned.mpkg的父安装程序包,我想用OS 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设置开发人员ID安装程序证书(此ID实际上与我的Apple不同,并且是特定于我的Apple)。我使用security工具获得这个ID值:
$ security find-certificate -a -c "Developer ID Installer" | grep "alis"
"alis"<blob>="Developer ID Installer: Foo B. Baz (ABCD1234)"我用这个ID值在每个子包上签名,这个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网关管理员。因此,安装程序包和内容似乎是正确的(或至少正确工作)。
我缺少哪些步骤或过程来生成与OS网关管理员一起工作的数字签名安装程序?
发布于 2015-02-08 05:44:53
我使用Packages.app创建包项目。
在Packages.app中,我将项目类型从Bundle更改为Flat,并重新构建安装程序存档。
然后,我通过上面描述的命令行继续执行productsign步骤,只不过我只需要对父pkg文件签名才能生成一个工作的、签名的安装程序(我没有对子包进行签名)。
使用pkgutil --flatten试图平平命令行上的mpkg包输出,最终导致安装程序崩溃,- I不得不将项目类型从Bundle更改为Packages.app中的Flat,并在应用程序中重新构建安装程序,并在Packages.app之外对平面安装程序文件进行签名。
https://stackoverflow.com/questions/28389664
复制相似问题