Как использовать productsign с mpkg, содержащим меньшие файлы pkg со знаком?
У меня есть родительский пакет установки, скажем, называется 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.) Я получаю это значение с помощью 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?
1 ответ
Я использовал Packages.app
создать пакетный проект.
В Packages.app
Я изменил тип проекта с Bundle
в Flat
и восстановил архив установщика.
Затем я приступил к productsign
шаги через командную строку, как описано выше, за исключением того, что мне нужно только подписать родительский pkg
файл для генерации работающего, подписанного установщика (я не подписывал дочерние пакеты).
С помощью pkgutil --flatten
чтобы попытаться сгладить mpkg
вывод пакета в командной строке повредил установщик - мне пришлось изменить тип проекта с Bundle
в Flat
в Packages.app
и перестроить установщик в этом приложении, и подписать плоский файл установщика за пределами Packages.app
,