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
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:
- Crea l'app nella struttura corretta
- Creare un diritto file
- Codice firma il tuo codice
- Firma il codice dei file all'interno del runtime in bundle, forzando la firma
- Firma il codice del runtime in bundle stesso
- Codice firma il file dell'app
- Pacchetto in un DMG
- Autenticarlo
- Spedirlo
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 comejava.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.
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.
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)