2

Parent.unsigned.mpkgOS X で署名したいという名前の親インストーラーパッケージがありますproductsign

このファイルには、 、 、Parent.unsigned.mpkgという子パッケージが含まれており、Clang でコンパイルされたコマンドライン バイナリとラッパー スクリプトがインストールされます。A.pkgB.pkgC.pkgbash

./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 に固有のものです)。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をフラット化しようとすると、インストーラーが破損しました。プロジェクト タイプをからwithinに変更し、そのアプリケーション内でインストーラーを再構築し、フラット インストーラー ファイルを外部で署名する必要がありました。mpkgBundleFlatPackages.appPackages.app

于 2015-02-08T05:44:53.440 に答える