У меня есть родительский установочный пакет, скажем, под названием 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, которая устанавливает (среди других сертификатов) сертификат установщика идентификатора разработчика с идентификатором ABCD1234
(этот идентификатор на самом деле отличается и относится к моему Apple ID). Я получаю это значение идентификатора с помощью инструмента security
:
$ security find-certificate -a -c "Developer ID Installer" | grep "alis"
"alis"<blob>="Developer ID Installer: Foo B. Baz (ABCD1234)"
Я подписываю каждый из этих дочерних пакетов этим значением идентификатора, которое, по-видимому, проходит без происшествий:
$ 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?