Подписание приложения OS X в Windows (без кода)

У меня есть приложение Windows, которое может работать на OS X под Wine. Для удобства я хочу упаковать приложение как приложение OS X (ZIP-архив xxx.app папка на основе WineBottler).

Обратите внимание, что основной исполняемый файл приложения (как определено CFBundleExecutable тег Info.plist) - это сценарий оболочки, а не бинарный.

Я хочу подписать приложение для прохождения через OS X Gatekeeper. Поскольку мой полный процесс сборки выполняется в Windows (а у меня вообще нет Mac), мне нужно подписать его в Windows.

Я уже обнаружил, что подписание приложения создает _CodeSignature папка с четырьмя файлами:

CodeDirectory
CodeRequirements
CodeResources
CodeSignature

Я не нашел никакой спецификации, описывающей содержимое этих файлов.

Экспериментально я обнаружил, что CodeResources XML-файл с хэшем SHA-1 всех файлов в приложении Я могу создать это.

Содержание CodeRequirements бинарный файл вроде исправлен. Похоже, что не меняется с содержанием приложения. Подтверждение приветствуется. Для чего этот файл хорош?

Что касается бинарных файлов CodeDirectory а также CodeSignature Я понятия не имею.

Оба файла изменяются вместе с содержимым приложения. Кажется, что любое изменение файла приложения (включая текстовый файл лицензии) влияет на них.

CodeSignature очевидно содержит подпись. Я могу видеть текстовую информацию о сертификате подписи кода в файле. Есть ли инструмент, который может генерировать файл? Поскольку это подпись, она должна быть довольно стандартной. Хотя могут быть некоторые дополнительные двоичные метаданные, которые могут усложнить генерацию. Кто-нибудь знает, что конкретно подписывает? Я могу представить, что это только знаки CodeResources Файл как таковой описывает все другие файлы в приложении. Или он на самом деле подписывает все файлы в приложении рекурсивно?

Родные приложения OS X имеют CodeResources только. Так что на самом деле нет подписи в _CodeSignature, Я полагаю, это потому, что они встроили подпись в основной исполняемый файл. Обратите внимание, что мой [Windows] двоичный файл (хотя он напрямую не упоминается Info.plist как упомянуто выше) имеет кодовую подпись с использованием Windows signtool.exe, Видимо OS X распознает подпись даже без ссылки как codesign -d -vvv xxx.app Вывод включает в себя информацию о сертификате:

Executable=/Applications/WinSCP.app/Contents/MacOS/startwine
Identifier=WinSCP
Format=bundle with generic
CodeDirectory v=20100 size=135 flags=0x0(none) hashes=1+3 location=embedded
Hash type=sha1 size=20
CDHash=a1ef4f04b2c1b4b793788ce3ab9d7881528f3d95
Signature size=4867
Authority=Martin Prikryl
Authority=VeriSign Class 3 Code Signing 2010 CA
Authority=VeriSign Class 3 Public Primary Certification Authority - G5
Signed Time=23.4.2014 23:51:18
Info.plist entries=14
Sealed Resources version=2 rules=12 files=846
Internal requirements count=2 size=136

Смущает то, что это вообще не упоминает двоичное имя. Во всяком случае, это не делает Gatekeeper счастливым. Обратите внимание, что приведенный выше тест выполняется с приложением, которое уже включает CodeResources файл (это, вероятно, что Sealed Resources version относится также как rules а также files количество совпадений с содержимым файла).

2 ответа

Решение

Мы попытались перепроектировать подпись кода, используя исходный код libsecurity_codesigning библиотека. Хотя это кажется выполнимым, это все еще слишком много усилий, поэтому мы считаем, что стоит отказаться. Мы хотели бы по крайней мере поделиться тем, что мы уже нашли, чтобы другие могли опираться на него.

Мы обнаружили, что когда codesign не находит двоичный файл MachO, он возвращается к "независимой от архитектуры" подписи, реализованной в SecCodeSigner::Signer::signArchitectureAgnostic,

Основные шаги там:

  • CodeDirectory генерация файлов. Каталог включает несколько хэшей SHA-1 различных частей пакета в дополнение к заголовку файла (включая версию каталога)
  • CodeSignature генерация файлов. Подпись знаки CodeDirectory файл с использованием формата криптографического синтаксиса сообщений (CMS). Подпись может быть проверена на любой платформе с использованием OpenSSL:

    openssl cms -verify -in CodeSignature -inform DER
        -content CodeDirectory -noverify -out CodeDirectory.verified
    

    Обратите внимание, что -noverify необходим для пропуска проверки сертификата, так как OpenSSL, похоже, не поддерживает назначение сертификатов "подписи кода".

    OpenSSL должен иметь возможность создавать подпись CMS с помощью следующей команды:

    openssl cms -sign -in CodeDirectory -out CodeSignature 
        -signer certificate.pem -outform DER
    

    Но такая подпись не принимается OS X.

Мы не получили дальше.

Не строго подписывать в Windows, но рассматривали ли вы удаленный рабочий стол для друзей Mac или аренду Mac в облаке? http://www.macincloud.com/ похоже, довольно разумные планы.

Может сэкономить много неприятностей. Все, что вам действительно нужно, - это инструмент кодирования и терминал.

Изменить: Вам все еще понадобится учетная запись Apple Developer для подписи приложения - Gatekeeper разрешает подписи только из выданных Apple сертификатов ID разработчика.

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