Подтвердить что ты не робот

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

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

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

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

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

CodeDirectory
CodeRequirements
CodeResources
CodeSignature

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

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

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

Что касается двоичных файлов CodeDirectory и CodeSignature, я понятия не имею.

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

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

У Native 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

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

4b9b3361

Ответ 1

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

Мы обнаружили, что, когда codesign не находит двоичный файл MachO, он возвращается к подписи "agosticic architecture", реализованной в 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.

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

Ответ 2

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

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

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