Как использовать 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,

Другие вопросы по тегам