Parent.unsigned.mpkg
OS X で署名したいという名前の親インストーラーパッケージがありますproductsign
。
このファイルには、 、 、Parent.unsigned.mpkg
という子パッケージが含まれており、Clang でコンパイルされたコマンドライン バイナリとラッパー スクリプトがインストールされます。A.pkg
B.pkg
C.pkg
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 に固有のものです)。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 で動作するデジタル署名されたインストーラーを生成するために、どのような手順または手順が欠けていますか?