Нотариально заверьте существующее Java-приложение для MacOS Catalina - PullRequest
1 голос
/ 24 октября 2019

Я распространяю Java-приложение для MacOS, оно подписано разработчиком, но не заверено нотариально. Не совсем уверен, с чего начать, так как документация настолько смещена в сторону создания приложений с XCode, что я не использую, но я просто хочу, чтобы самый простой способ нотариально заверить свое приложение и двигаться дальше.

Чтение документацииУ меня уже есть несколько проблем:

  • В настоящее время я использую Java 8, возможно ли нотариально заверять приложение Java 8 или мне нужно перейти на Java 11. Я бы предпочел не двигатьсяв Java 11, потому что это могло бы вызвать проблемы на некоторых других платформах, которые я поддерживаю.

  • Мой компьютер dev Mac - это старый MacBook Pro, и поэтому он не может быть обновлен после OSX El Capitan 10.11.6могу ли я заверить нотариально с этой машиной или нет? У меня есть более свежая машина, но она не настроена для разработки, и у меня есть некоторые опасения по поводу переноса на нее сертификатов Developer Id, поскольку ее установка была проблематичной.

  • Iиспользуйте AppBundler fork https://github.com/TheInfiniteKind/appbundler/ для упаковки моего приложения

  • Это вызывается файлом сборки ant-скрипта, который выполняет подпись и т. д., в конце концов мы создаем dmg, используя dmgCanvas

  • Я выкладываю нижеприведенный скрипт для муравья, надеясь, что кто-то может начать меня с основных шагов

    #!/bin/bash
    #set -x
    
    cd /Users/paul/code/jthink/songkong/src/main/scripts
    hiutil -C  -fapplehelpbook/SongKongHelp/SongKongHelp.helpindex applehelpbook/SongKongHelp/
    cd /Users/paul/code/jthink/songkong
    rm -fr /Applications/SongKong.app
    mvn clean
    mvn -DskipTests=true install
    rm -fr target/songkong-6.6
    unzip target/songkong-6.6-distribution.zip -d target
    ant
    while read line; do
      echo "$line"
      if [[ "$line" = "<string>1.0</string>" ]]; then
        cat mergefile.txt    # or echo or printf your extra lines
      fi
    done < /Applications/SongKong.app/Contents/Info.plist > Info.new
    while read line; do
      echo "$line"
      if [[ "$line" = "<false/></dict>" ]]; then
        cat mergefile2.txt
      fi
    done < Info.new > Info.new2
    rm /Applications/SongKong.app/Contents/Info.plist
    rm Info.new
    mv Info.new2 /Applications/SongKong.app/Contents/Info.plist
    sudo cp -r target/songkong-6.6/applehelpbook/SongKongHelp /Applications/SongKong.app/Contents/Resources
    rm /Applications/SongKong.app/Contents/PlugIns/jdk1.8.0_192.jdk/Contents/MacOS/libjli.dylib
    cp /Applications/SongKong.app/Contents/PlugIns/jdk1.8.0_192.jdk/Contents/Home/jre/lib/jli/libjli.dylib /Applications/SongKong.app/Contents/PlugIns/jdk1.8.0_192.jdk/Contents/MacOS
    export CODESIGN_ALLOCATE="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/codesign_allocate"
    
    /usr/bin/codesign --sign "Developer ID Application: P Taylor" --force --deep --verbose /Applications/SongKong.app
    /usr/bin/codesign --verify --deep  --verbose /Applications/SongKong.app
    
    cd /Users/paul/code/jthink/SongKong
    /usr/local/bin/dmgcanvas /Users/paul/code/jthink/SongKong/dmgCanvas_songkong.dmgCanvas /Users/paul/songkong-osx.dmg -v SongKong
    

Ответы [ 4 ]

1 голос
/ 25 октября 2019
  • AFAIK, вам нужна Java 11 (см. JDK-8223671 ), однако недавно мне сказали , что Java 8 также может работать. Я не пробовал это.

  • JDK-8223671 содержит некоторую полезную информацию. В частности, вам нужно добавить права к вашему вызову кода:

codesign --entitlements java.entitlements --options runtime --deep -vvv -f --sign "Developer ID Application: Bla Bla (XXXX)" YourApp.app

Рабочий пример файла java.entitlements может выглядеть следующим образом:

<?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> 
  • Объединение сгенерированной jlink среды выполнения является трудной задачей, поскольку она содержит ссылки sym (которые не разрешены при подписании), а также легальную папку, которая содержит имена папок, такие как java.xml.). codesign, к сожалению, немного глуповат и считает, что такие папки являются нераспознанными пакетами и отменяются. Поэтому вам следует переименовать эти файлы / папки и разрешить любые ссылки на SIM-карты перед созданием ссылок.

  • Если вы используете jlink, обязательно добавьте необходимых поставщиков услуг, например, jdk. crypto.ec для HTTPS . Также обратите внимание, что AFAIK в Java 11 TLSv1.3 по крайней мере частично поврежден (загрузка больших файлов), и вы должны отключить его, например, с помощью -Dhttps.protocols=TLSv1.1,TLSv1.2.

  • Если вы используетеAppBundler fork, вам необходимо убедиться, что он также соответствует рекомендациям Apple, т. Е. Связан с macOS 10.9. Я считаю, что по умолчанию AppBundler ссылается на 10.7, но изменить его просто.

  • Если вы используете Java 11 или более позднюю версию, убедитесь, что вы связываете libjli.dylib в /Contents/PlugIns/JAVA_PLUGIN_NAME/Contents/Home/lib/jli/libjli.dylib. Очевидно, это необходимо для запуска и не может быть в комплекте по умолчанию.

  • На некоторые другие ваши вопросы ответили в руководящих принципах Apple :

Нотариальное заверение требует Xcode 10 или новее. Создание нового приложения для нотариального заверения требует macOS 10.13.6 или более поздней версии. Для сшивания приложения требуется macOS 10.12 или более поздняя версия.

1 голос
/ 25 октября 2019

Относительно Java 8 - к моему удивлению (после прочтения постов Хендрика Шрайбера), когда я нотариально заверял приложение, содержащее Java 8, оно ... только что заработало - https://twitter.com/dan_gravell/status/1187000856186634246

Редактировать 14/11/2018 - получаетсяЭто может быть временная отсрочка для JDK, созданных для более старых версий macOS SDK - см. https://developer.apple.com/news/?id=09032019a. Эта отсрочка длится до января 2020 года.

С точки зрения шагов, которые я нашел, довольно просто следовать https://developer.apple.com/documentation/security/notarizing_your_app_before_distribution/customizing_the_notarization_workflow

Есть только два реальных шага, если у вас есть DMG / ZIP для нотариального заверения:

  1. Отправка нотариального запроса
  2. Сшивание результата в случае его успешности

Я полагаю, опрос для результата можно считать еще одним шагом.

Моя самая большая проблема заключалась в настройке - вам нужна активная учетная запись в Программе разработчика с Apple ID (что легко), но затем, когда вы следуете инструкциям, чтобы добавить пароль в цепочку для ключей, используйте Специальный пароль приложения . Вам также необходимо включить двухфакторную аутентификацию для вашей учетной записи Apple ID.

Как только вы обработаете вызовы командной строки, это довольно легко автоматизировать в скрипте сборки.

1 голос
/ 25 октября 2019

Для нотариального заверения требуется Xcode 10, а для сшивания требуется не менее Sierra .

«Для нотариального заверения требуется Xcode 10 или более поздняя версия. Создание нового приложения для нотариального заверения требует macOS 10.13.6 или более поздней версии. Для сшивания приложения требуется macOS 10.12 или более поздняя версия. ”https://developer.apple.com/documentation/security/notarizing_your_app_before_distribution

Что касается переноса dev-сертификатов, пусть Xcode справится с этой задачей, экспортировав свой профиль на старый компьютер и импортировав его на новый.

0 голосов
/ 13 ноября 2019

С помощью опубликованных ответов у меня все работает, я также обнаружил, что последняя версия DmgCanvas упростила процесс, это были мои шаги

  • Настройка новой машины (настройка кода src ectera)
  • Обновление до последней версии Java 8 (jdk1.8.0_231.jdk)
  • Установите XCode, затем перейдите в Предпочтения: Загрузки и выберите Установить инструменты командной строки
  • Используя KeyChain Export Id разработчикаСертификат в формате .p12 и импорт на новый компьютер
  • Приобретите и установите DmgCanvas 3 (30 долларов США)
  • Обновите учетную запись Apple Developer
  • Установите двухэтапную авторизацию для моей учетной записи AppleId(это частично делается на веб-сайте и частично с приложением iCloud)
  • Создание пароля для конкретного приложения (позже потребуется сделать заметку)
  • соответственно изменил скрипт конца сборки (заменив appSpecificPassword)с тем, который я создал

    export CODESIGN_ALLOCATE="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/codesign_allocate"
    /usr/bin/codesign --sign "Developer ID Application: P Taylor" --force --deep --verbose /Applications/SongKong.app
    /usr/bin/codesign --verify --deep  --verbose /Applications/SongKong.app
    cd /Users/paul/code/jthink/SongKong
    /usr/local/bin/dmgcanvas /Users/paul/code/jthink/SongKong/dmgCanvas_songkong.dmgCanvas /Users/paul/songkong-osx.dmg -v SongKong -identity "Developer ID Application: P Taylor" -notarizationAppleID paultaylor@jthink.net -notarizationPassword appSpecificPassword  -notarizationPrimaryBundleID songkong
    

Запустил его, и это сработало, этап нотариального заверения занял около 45 минут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...