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


person Alex Reynolds    schedule 08.02.2015    source источник


Ответы (1)


Я использовал Packages.app для создания проекта пакета.

В рамках Packages.app я изменил тип проекта с Bundle на Flat и пересобрал архив установщика.

Затем я выполнил productsign шагов через командную строку, как описано выше, за исключением того, что мне нужно только подписать родительский pkg файл, чтобы сгенерировать работающий подписанный установщик (я не подписывал дочерние пакеты).

Использование pkgutil --flatten для выравнивания вывода пакета mpkg в командной строке привело к повреждению установщика — мне пришлось изменить тип проекта с Bundle на Flat в Packages.app и перестроить установщик в этом приложении, а также подписать плоский файл установщика за пределами Packages.app .

person Alex Reynolds    schedule 08.02.2015
comment
Я также пытаюсь подписать файл my.pkg и получаю следующую ошибку: «Для подписания продуктов в плоском стиле требуется удостоверение подписи установщика (не удостоверение подписи приложения)». В Packages.app я настраиваю формат проекта как плоский. Помогите, пожалуйста. - person Pavel; 07.11.2017
comment
Похоже, вам нужно использовать сертификат установщика, чтобы подписать установщик. Сертификат приложения будет для приложения, а не для установщика. Вам нужно будет войти в свою учетную запись Apple Developer и создать/загрузить сертификат установщика. - person Alex Reynolds; 07.11.2017
comment
evernote.com/l/AS24Migyho5PIqf4GVBuYwBsoyScDdeWh3Q Здесь мы видим, что «Идентификатор разработчика» также используется для установщика упаковка. Здесь я создаю сообщение, посмотрите пожалуйста файл, который содержит другие файлы pkg"> stackoverflow.com/questions/47149047/ - person Pavel; 07.11.2017