Notarier l'application Java existante pour macOS Catalina


Je distribue une application Java pour macOS, elle est signée développeur mais non notariée. Je ne sais pas vraiment par où commencer car la documentation est tellement biaisée pour créer des applications avec Xcode que je n'utilise pas, mais je veux juste le moyen le plus simple de notariser mon application, puis de passer à autre chose.

En lisant la documentation, j'ai déjà quelques préoccupations:

  • J'utilise actuellement Java 8, est-il possible de notariser une application Java 8 ou dois-je passer à Java 11. Je préférerais ne pas passer à Java 11 car cela poserait problème sur d'autres plates-formes que je supporte.

  • Mon dev Mac machine est un ancien MacBook Pro, et en tant que tel ne peut pas être mis à jour après OSX El Capitan 10.11.6, puis-je notarier avec cette machine ou non? J'ai une machine plus récente, mais elle n'est pas configurée pour le développement et j'ai quelques préoccupations concernant le transfert des certificats d'ID de développeur, car la configuration était problématique en premier lieu.

  • J'utilise la fourche AppBundler https://github.com/TheInfiniteKind/appbundler/ pour empaqueter mon application

  • Ceci est appelé par un fichier de construction de script ant qui fait la signature, etc., nous finissons par créer un dmg en utilisant dmgCanvas

  • Je poste le script ant ci-dessous, en espérant que quelqu'un puisse me commencer par les étapes de base

    #!/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
    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
    
Author: Paul Taylor, 2019-10-24

4 answers

Edit 12/2/2020 - il y a eu beaucoup de changements car Apple a lentement resserré les exigences en matière de notarisation. À partir du 3 février, ils semblent avoir atteint la dernière étape, ce qui signifie que votre application doit répondre à des exigences beaucoup plus élevées, y compris un JRE construit sur le dernier SDK et avec un support "durci runtime".

J'ai donc dépouillé une grande partie de l'ancienne discussion.

Mon premier problème était la configuration-vous avez besoin d'un compte de programme Développeur actif avec un identifiant Apple (qui est facile) mais ensuite, lorsque vous suivez les instructions pour ajouter un mot de passe au trousseau, utilisez le Mot de passe spécifique à l'application. Vous devez également activer l'authentification à deux facteurs pour votre compte Apple ID.

Une fois que vous travaillez sur les appels de ligne de commande, il est assez facile d'automatiser dans un script de construction. J'ai utilisé jpackage pour créer l'application et le DMG, mais méfiez - vous - actuellement son approche de la signature de l'app ne fonctionne pas.

En termes de script, voici ce que je fais pour coder sign l'application adaptée à la notarisation (cela suppose qu'un .app est déjà créé):

% security unlock-keychain -p passwordhere codesigning.keychain
% find my-app.app -type f \
  -not -path "*/Contents/runtime/*" \
  -not -path "*/Contents/MacOS/my-app" \
  -not -path "*libapplauncher.dylib" \
  -exec codesign --timestamp --entitlements /tmp/bliss.entitlements -s "XXX" --prefix com.myapp. --options runtime -v --keychain /path/to/codesigning.keychain {} \;

% find my-app.app/Contents/runtime -type f \
  -not -path "*/legal/*" \
  -not -path "*/man/*" \
  -exec codesign -f --timestamp --entitlements /tmp/bliss.entitlements -s "XXX" --prefix com.myapp. --options runtime -v --keychain /path/to/codesigning.keychain {} \;

% codesign -f --timestamp --entitlements /tmp/bliss.entitlements -s "XXX" --prefix com.myapp. --options runtime -v --keychain /path/to/codesigning.keychain my-app.app/Contents/runtime

% codesign -f --timestamp --entitlements /tmp/bliss.entitlements -s "XXX" --prefix com.myapp. --options runtime -v --keychain /path/to/codesigning.keychain my-app.app

Les droits devraient être:

<?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>

Tous les tests fonctionnent:

% codesign -vvv --deep --strict my-app.app/Contents/runtime 
my-app.app/Contents/runtime: valid on disk
my-app.app/Contents/runtime: satisfies its Designated Requirement
% codesign -vvv --deep --strict my-app.app/                
--prepared:/private/tmp/my-app.app/Contents/MacOS/libapplauncher.dylib
--validated:/private/tmp/my-app.app/Contents/MacOS/libapplauncher.dylib
my-app.app/: valid on disk
my-app.app/: satisfies its Designated Requirement
% spctl -a -t exec -vv my-app.app          
my-app.app: accepted
source=Developer ID
origin=XXX

À ce stade, vous devriez également essayer d'exécuter votre application - le processus de signature de code peut casser des choses.

À partir de là, vous pouvez créer un DMG (encore une fois, j'utilise jpackage) et cela devrait passer la notarisation.

En résumé:

  1. Construire l'application dans la structure correcte
  2. Créer un droit fichier
  3. Code signez votre code
  4. Le code signe les fichiers à l'intérieur de l'exécution groupée, forçant la signature
  5. Code signe le runtime fourni lui-même
  6. Code signez votre fichier d'application
  7. Paquet dans un DMG
  8. Légaliser
  9. Expédiez-le
 7
Author: Dan Gravell, 2020-02-12 17:25:46
  • AFAIK, vous avez besoin de Java 11 (voir JDK-8223671), cependant, récemment on m'a dit que Java 8 pouvait également fonctionner. Je n'ai pas essayé ce.

  • JDK-8223671 contient quelques informations utiles. Plus précisément, vous devez ajouter des droits à votre appel de signe de code:

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

Un exemple de travail java.entitlements fichier pourrait ressembler à ceci:

<?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> 
  • Regrouper un runtime généré par jlink est une douleur, car il contient des liens sym (qui ne sont pas autorisés lors de la signature) et aussi un dossier légal qui contient des noms de dossiers comme java.xml (avec un .). codesign est malheureusement un peu stupide et croit que de tels dossiers sont des paquets non reconnus et des abandons. Par conséquent, vous devez renommer ces fichiers / dossiers et résoudre tous les liens sim avant jlinking.

  • Si vous utilisez jlink , assurez-vous d'ajouter les fournisseurs de services nécessaires, par exemple jdk.crypto.ec pour HTTPS. Notez également que AFAIK, en Java 11 TLSv1. 3 est au moins partiellement cassé (téléchargement de fichiers volumineux) et vous devez le désactiver, par exemple avec -Dhttps.protocols=TLSv1.1,TLSv1.2.

  • Si vous utilisez le fork AppBundler, vous devrez vous assurer qu'il adhère également aux directives d'Apple, c'est-à-dire qu'il est lié à macOS 10.9. Je crois que par défaut AppBundler lie contre 10.7, mais le changer est simple.

  • Si vous utilisez Java 11 ou une version ultérieure, assurez-vous que vous bundle libjli.dylib dans /Contents/PlugIns/JAVA_PLUGIN_NAME/Contents/Home/lib/jli/libjli.dylib. Apparemment cela est nécessaire par le lanceur et peut ne pas être livré par défaut.

  • Certaines de vos autres questions sont répondues dans les lignes directrices d'Apple :

La notarisation nécessite Xcode 10 ou une version ultérieure. La création d'une nouvelle application pour la notarisation nécessite macOS 10.13.6 ou version ultérieure. L'agrafage d'une application nécessite macOS 10.12 ou version ultérieure.

 3
Author: Hendrik, 2019-10-25 06:47:52

Pour notarier nécessite Xcode 10, et pour agrafer nécessite au moins Sierra.

"La notarisation nécessite Xcode 10 ou une version ultérieure. La création d'une nouvelle application pour la notarisation nécessite macOS 10.13.6 ou version ultérieure. L'agrafage d'une application nécessite macOS 10.12 ou version ultérieure."https://developer.apple.com/documentation/security/notarizing_your_app_before_distribution

En ce qui concerne le transfert de certificats de développement, laissez Xcode gérer cette tâche en exportant votre profil sur l'ancienne machine et en l'important sur le nouveau.

 1
Author: Richard Barber, 2019-10-24 21:20:45

Mise à jour à partir du 3 février 2020 Apple a resserré les exigences de notarisation, réponse réécrite.

Remarque:J'avais besoin du JRE AdoptJdk Java 11.0.7, les versions antérieures ne fonctionnaient pas pour moi.

Ce sont mes pas

  • Configuration de la nouvelle machine (configuration du code src ectera)
  • Installez XCode puis allez dans Préférences: Téléchargements et sélectionnez Installer les outils de ligne de commande
  • Utilisation de KeyChain d'Exportation Certificat d'identification du Développeur comme .format p12 et importation dans new machine
  • Acheter et installer DmgCanvas 3 ($30USD)
  • Renouveler le compte développeur Apple
  • Configuration de l'autorisation en deux étapes pour mon compte AppleID (cela se fait en partie sur le site Web et en partie avec l'application iCloud)
  • Créer un mot de passe spécifique à l'application (notez que les options dmgCanvas seront nécessaires)
  • Installer AdoptJdk Java 11.0.7 pour construire
  • Installer AdoptJdk Java 11.0.7 JRE pour le regroupement à l'intérieur de l'application
  • Créer songkong.entitlements fichier
  • Configurer construire.fichier xml utilisé par Appbundler InfiniteKind fork pour se référer directement à la construction AdoptOpenJDK JRe
  • Configurez le script de construction pour signer le bundle créé par appbundler, en veillant à utiliser les nouvelles options de signature requises (par exemple-runtime, entit entitlements, --timestamp)
  • Le script de construction crée ensuite un dmg en utilisant dmgCanvas, et cela signe en outre le dmg et l'envoie à Apple pour notarisation

Construire.xml comprend:

<runtime dir="/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jre/Contents/Home"/>

Buildosx.sh est

#!/bin/bash
#set -x

cd /Users/paul/code/jthink/songkong
sudo rm -fr /Applications/SongKong.app
mvn -f pommacos.xml -DskipTests=true install
rm -fr target/songkong-6.9
unzip target/songkong-6.9-distribution.zip -d target
ant
export CODESIGN_ALLOCATE="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/codesign_allocate"
/usr/bin/codesign --timestamp --options runtime \
--entitlements /Users/paul/code/jthink/songkong/songkong.entitlements \
--sign "Developer ID Application: P Taylor" \
--force --deep --verbose /Applications/SongKong.app
/usr/bin/codesign -vvv --deep --strict /Applications/SongKong.app
spctl -a -t exec -vv /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 [email protected] \
 -notarizationPassword password \
 -notarizationPrimaryBundleID songkong

Le fichier de droits SongKong est:

<?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>

Note : J'ai également essayé cela en me référant à AdoptJdk Java 11.0.7 JDK build.xml et qui se construit également sans problème (bien que bien sûr se retrouvent avec un dmg beaucoup plus grand)

 0
Author: Paul Taylor, 2020-04-19 07:45:24