Autenticare l'applicazione Java esistente per macOS Catalina


Distribuisco un'applicazione Java per macOS, è firmata dallo sviluppatore ma non autenticata. Non sono davvero sicuro da dove cominciare dato che la documentazione è così prevenuta verso la creazione di app con Xcode che non uso, ma voglio solo il modo più semplice per autenticare la mia app e poi andare avanti.

Leggendo la documentazione ho già alcune preoccupazioni:

  • Attualmente sto usando Java 8, è possibile autenticare un'app Java 8 o devo passare a Java 11. Preferirei non passare a Java 11 perché causerebbe problemi su alcune altre piattaforme che sostengo.

  • La mia macchina dev Mac è un vecchio MacBook Pro, e come tale non può essere aggiornato dopo OSX El Capitan 10.11.6, posso autenticare con questa macchina o no? Ho una macchina più recente ma non è configurata per lo sviluppo e ho alcune preoccupazioni sul trasferimento dei certificati ID sviluppatore perché la configurazione era problematica in primo luogo.

  • Io uso la forcella AppBundler https://github.com/TheInfiniteKind/appbundler / per impacchettare la mia app

  • Questo è chiamato da un file di compilazione di script ant che esegue la firma ecc., alla fine creiamo un dmg usando dmgCanvas

  • Postare lo script formica qui sotto, sperando che qualcuno mi può iniziare con i passaggi di 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

Modifica 12/2/2020 - ci sono stati un sacco di cambiamenti perché Apple hanno lentamente inasprito i requisiti per l'autenticazione notarile. Dal 3 febbraio sembrano aver raggiunto la fase finale, il che significa che la tua app deve soddisfare requisiti molto più elevati, incluso un JRE che è costruito contro l'ultimo SDK e con supporto "runtime indurito".

Così ho spogliato gran parte della vecchia discussione.

Il mio primo problema è stato l'impostazione: è necessario un account Developer Program attivo con ID Apple (che è facile) ma poi, quando si seguono le istruzioni per aggiungere una password al portachiavi, utilizzare il App specifica password. Devi anche abilitare l'autenticazione a due fattori per il tuo account ID Apple.

Una volta elaborate le chiamate da riga di comando, è abbastanza facile automatizzare in uno script di compilazione. Ho usato jpackage per creare l'app e il DMG ma attenzione - attualmente il suo approccio alla firma dell'app non funziona.

In termini di scripting, ecco cosa sto facendo per firmare il codice l'applicazione adatta per l'autenticazione notarile (questo presuppone un .app è già stato creato):

% 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

I diritti dovrebbero essere:

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

Tutti i test funzionano:

% 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

A questo punto dovresti anche provare a eseguire la tua app: il processo di firma del codice può rompere le cose.

Da qui, è possibile creare un DMG (di nuovo, io uso jpackage) e questo dovrebbe passare notarile.

In sintesi:

  1. Crea l'app nella struttura corretta
  2. Creare un diritto file
  3. Codice firma il tuo codice
  4. Firma il codice dei file all'interno del runtime in bundle, forzando la firma
  5. Firma il codice del runtime in bundle stesso
  6. Codice firma il file dell'app
  7. Pacchetto in un DMG
  8. Autenticarlo
  9. Spedirlo
 7
Author: Dan Gravell, 2020-02-12 17:25:46
  • AFAIK, hai bisogno di Java 11 (vedi JDK-8223671), tuttavia, recentemente mi è stato detto che Java 8 potrebbe anche funzionare. Non ci ho provato.

  • JDK-8223671 contiene alcune informazioni utili. In particolare, è necessario aggiungere diritti alla chiamata del segno di codice:

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

Un file di esempio java.entitlements funzionante potrebbe essere simile a questo:

<?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> 
  • Raggruppare un runtime generato da jlink è un problema, perché contiene collegamenti sym (che non sono consentiti durante la firma) e anche una cartella legale che contiene nomi di cartelle come java.xml (con un .). codesign è sfortunatamente un po ' stupido e crede che tali cartelle siano bundle e interruzioni non riconosciuti. Pertanto è necessario rinominare tali file / cartelle e risolvere eventuali collegamenti sim prima di jlinking.

  • Se si utilizza jlink, assicurarsi di aggiungere i fornitori di servizi necessari, ad esempio jdk.crypto.ec per HTTPS. Si noti inoltre che AFAIK, in Java 11 TLSv1.3 è almeno parzialmente rotto (caricamento di file di grandi dimensioni) e dovresti disabilitarlo, ad esempio con -Dhttps.protocols=TLSv1.1,TLSv1.2.

  • Se si utilizza il fork AppBundler, è necessario assicurarsi che aderisca anche alle linee guida di Apple, ovvero che sia collegato a macOS 10.9. Credo che per impostazione predefinita i collegamenti AppBundler contro 10.7, ma cambiarlo è semplice.

  • Se si utilizza Java 11 o versione successiva, assicurarsi di raggruppare libjli.dylib in /Contents/PlugIns/JAVA_PLUGIN_NAME/Contents/Home/lib/jli/libjli.dylib. Apparentemente questo è necessario al launcher e potrebbe non esserlo in bundle per impostazione predefinita.

  • Alcune delle tue altre domande trovano risposta nelle linee guida di Apple:

L'autenticazione notarile richiede Xcode 10 o versione successiva. La creazione di una nuova app per l'autenticazione notarile richiede macOS 10.13.6 o versione successiva. La pinzatura di un'app richiede macOS 10.12 o versione successiva.

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

Per autenticare richiede Xcode 10 e per pinzare richiede almeno Sierra.

"L'autenticazione notarile richiede Xcode 10 o versione successiva. La creazione di una nuova app per l'autenticazione notarile richiede macOS 10.13.6 o versione successiva. La pinzatura di un'app richiede macOS 10.12 o versione successiva."https://developer.apple.com/documentation/security/notarizing_your_app_before_distribution

Per quanto riguarda il trasferimento di certificati dev, lascia che Xcode gestisca questa attività esportando il tuo profilo sulla vecchia macchina e importandolo sul nuovo.

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

Aggiornamento a partire dal 3 febbraio 2020 di Apple hanno stretto i requisiti di autenticazione notarile, risposta riscritta.

Nota: ho richiesto l'AdoptJdk Java 11.0.7 JRE, le versioni precedenti non funzionavano per me.

Questi sono i miei passi

  • Configurazione nuova macchina (configurazione codice src ectera)
  • Installa XCode quindi vai a Preferenze: Download e seleziona Installa strumenti da riga di comando
  • Utilizzo del certificato ID sviluppatore Keychain Export as .formato p12 e importazione in nuovo macchina
  • Acquista e installa DmgCanvas 3 ($30USD)
  • Rinnova l'account sviluppatore Apple
  • Imposta l'autorizzazione in due passaggi per il mio account AppleId (in parte sul sito Web e in parte con l'app iCloud)
  • Creare una password specifica app (fare una nota sarà necessario per le opzioni dmgCanvas)
  • Installa AdoptJdk Java 11.0.7 per la creazione di
  • Installa AdoptJdk Java 11.0.7 JRE per il raggruppamento all'interno dell'app
  • Crea songkong.entitlements file
  • Configura costruire.file xml utilizzato da Appbundler InfiniteKind fork per fare riferimento direttamente alla build JRE AdoptOpenJDK
  • Configura lo script di compilazione per firmare il bundle creato da appbundler, assicurandoci di utilizzare le nuove opzioni di firma richieste (ad esempio-runtime, entit entitlements, tim timestamp)
  • Lo script di compilazione crea quindi un dmg usando dmgCanvas, e questo firma ulteriormente il dmg e lo invia ad Apple per la autenticazione notarile

Costruire.xml include:

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

Buildosx.sh è

#!/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

Il file dei diritti SongKong è:

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

Nota:Ho anche provato questo con riferimento ad AdoptJdk Java 11.0.7 JDK build.xml e che costruisce anche senza problemi (anche se ovviamente finiscono con un dmg molto più grande)

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