Правильный способ кодирования Qt-приложения .app и dmg на MacOS? - PullRequest
1 голос
/ 26 мая 2019

У меня есть кроссплатформенное приложение, написанное на Qt (5.9.6), работающее на Win, Mac и Ubuntu.

На Mac приложение создано только с использованием инструментов Qt (без Xcode).

Приложение имеет стороннюю библиотеку ffpmeg.Мы не компилируем его, мы используем предварительно скомпилированный файл из https://ffmpeg.org/download.html#build-mac.

. На начальном этапе предполагается, что приложение будет распространяться через dmg-образ, подписанный Developer ID (в противном случае Gatekepeer выдает сообщениенедоверенный разработчик).

dmg-образ создается с помощью hdutil (не с помощью macdeployqt util).

Я пытался подписать.файл приложения и dmg-образ с сертификатами от Apple Developer Program, в частности:

  • macOS -> Production -> Developer ID. Подпишите версии вашего приложения Mac, расширения ядра Mac и пакета установщика Mac для распространения.за пределами Mac App Store -> Установщик идентификатора разработчика Этот сертификат используется для подписи пакета установщика вашего приложения для распространения вне Магазина Mac App Store
  • macOS -> Производство -> Знак идентификатора разработчикаверсии вашего приложения Mac, расширения ядра Mac и пакета установщика Mac для распространения за пределами Mac App Store -> ID разработчикаПриложение Этот сертификат используется для кодовой подписи вашего приложения для распространения за пределами Mac App Store.

(насколько я понимаю - это сертификаты для нашего случая - распространение за пределами AppStore)

Все сертификаты правильно установлены в системе и отображаются в «Цепочке для ключей».

Подписание приложения с помощью кодов вручную.

Если я пытаюсь подписать файл Application.appнапрямую, то codeign отвечает: « объект кода вообще не подписан ».Приложение не считается подписанным.

Затем, после нескольких часов поиска в Google, я обнаружил, что мне нужно подписать все .framework , .dylib-файлы и плагины внутри dmg.

Затем я стал подписывать все файлы, пока кодовый знак в приложении не перестанет выдавать ошибку.Например:

...
$ codesign -s 9509FE0B2EBCC89D9047541AC762418395FCB40E Application.app
Application.app/: code object is not signed at all
# error, go next

$ codesign -s 9509FE0B2EBCC89D9047541AC762418395FCB40E Application.app/Contents/Frameworks/libavcodec.58.dylib
# ffmpeg is also shuld be signed - otherwise macOS give a not-at-all-error
...

$ codesign -s 9509FE0B2EBCC89D9047541AC762418395FCB40E Application.app/Contents/Frameworks/QtCore.framework
# Qt also sign
...

$ codesign -s 9509FE0B2EBCC89D9047541AC762418395FCB40E Application.app
# Ok, dmg is successfully signed.

Codesign перестает ругаться с не полностью подписанным пакетом.

Затем запустите Application.app на нашей машине - все в порядке.Затем запустите на другом Mac - результат при открытии файла Application.app:

" Программа Application.app повреждена и не может быть открыта. Переместите программу в корзину. "

Он отказывается запускаться даже через «хак» для ненадежных приложений (через Command-button).

Но - не полностью подписанное приложение на другом Mac работает нормально (но ругается на ненадежного разработчика).

Итак, мой вопрос:

Как подписать Qt-приложение .app и dmg сторонними библиотеками (ffmpeg)?

Спасибо!

1 Ответ

0 голосов
/ 31 мая 2019

Приложение не может быть запущено, поскольку оно нарушило некоторые ограничения кодового знака. Вы должны подписать с параметром entitlements, чтобы отключить эти ограничения.

Вот образец entitlements.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.security.cs.allow-jit</key>
    <true/>
    <key>com.apple.security.cs.allow-unsigned-executable-memory</key>
    <true/>
    <key>com.apple.security.cs.disable-executable-page-protection</key>
    <true/>
    <key>com.apple.security.cs.disable-library-validation</key>
        <true/>
        <key>com.apple.security.cs.allow-dyld-environment-variables</key>
        <true/>
</dict>
</plist>

ошибка нотариального заверения macOS: «Используемый алгоритм подписи слишком слабый»

...