Java >> Java tutorial >  >> Tag >> package

Kodesignering + notarisering ved hjælp af jpackage-værktøjet virker ikke på macOS

Jeg vil gå videre og besvare mit eget spørgsmål, fordi jeg endte med at finde ud af, hvordan jeg underskriver min ansøgning og får den notariseret fra Apples notariseringstjeneste (mit produkt er http://cardr.x10.bz).

  1. Brug jpackages app-image-indstilling til at generere en usigneret app-pakke.

  2. Brug et automatiseret bash-script til at designe alle dylib- og eksekverbare filer inde i app-pakken ved hjælp af codesign -vvv --options runtime --deep --force --sign "Developer ID Application: ********" <filename> .

  3. Dette er en flertrinsprocedure, så jeg deler den op i A/B/C.

3A) Find alle jar-filer i MyApp.app/Contents/mods/, der indeholder indlejrede .dylib-filer, og udpak disse filer til en bestemt mappe (eller skriv et lille program til at gøre dette for dig). For mig var min app afhængig af JavaFX, så mange af JavaFX-bibliotekerne indeholdt .dylib-filer i jar-filerne. Men hvis du kun bruger standard-Java-bibliotekerne, bør du være i stand til at springe til trin 4, da standard-Java-bibliotekerne ikke indeholder .dylib-filer. Grunden til, at vi skal udføre dette trin, er, fordi Apples notariseringstjeneste også tjekker disse indlejrede .dylib-filer for co-design.

3B) Brug et automatiseret bash-script til at codesigne alle dylib-filer, som du lige har udtrukket, ved hjælp af codesign -vvv --options runtime --deep --force --sign "Developer ID Application: ********" <filename> .

3C) Tilføj hver af de signerede .dylib-filer tilbage til deres respektive jar-filer for at erstatte de originale usignerede indlejrede .dylib-filer. Her er en kommando, der kan være nyttig:jar uf <path to jar file> <path to dylib file> . Vær opmærksom på, at den anden angivne sti, stien til dylib-filen, også skal være dylibens relative placering i arkivet. Tag et kig her for flere detaljer - https://docs.oracle.com/javase/tutorial/deployment/jar/update.html.

  1. Nu hvor du har signeret hver af de eksekverbare filer og dylib-filer i .appen, er det tid til at signere selve .appen. Kør codesign -vvv --force --sign "Developer ID Application: ********" MyApp.app .

  2. Nu hvor du har signeret .appen, skal du køre jpackage på app-pakken for at lave enten en DMG eller en PKG ud af den. Du er velkommen til at bruge jpackage mac-signeringsfunktionerne, som vil signere den ydre DMG/PKG. Vær opmærksom på, at ejendommen --mac-signing-key-user-name "My Developer Account Name (*******)" bør IKKE inkludere delen "Udvikler-id-applikation/installationsprogram" af certifikatet.

  3. Endelig har du oprettet en underskrevet PKG/DMG klar til notarisering. Brug xcrun altool --notarize-app --username <apple-id> --password <app-specific-password> <MyApp.dmg or MyApp.pkg> . Vent på, at notariseringen er fuldført, og sørg for, at den er godkendt.

  4. Hvis notarisering lykkedes (det burde), kan du hæfte din apps billet til PKG-installationsprogrammet ved hjælp af xcrun stapler staple MyApp.pkg .

Håber dette hjælper!


For et fungerende ende-til-ende-script til min app (Unattach), se darwin sektion af package.sh.


FYI - Dykkede ned i dette problem i JDK 14.0.1 og ønskede at dele viden som en anden midlertidig løsning, indtil jpackage fungerer korrekt.

I JDK 14-kildestien:src/jdk.incubator.jpackage/macosx/classes/jdk/incubator/jpackage/internal

filen MacAppBundler.java indeholder disse linjer (81 &82):"Udvikler-id-applikation:"+ SIGNING_KEY_USER.fetchFrom(params),

hvor SIGNING_KEY_USER henter værdien af ​​--mac-signing-key-user-name parameter fra kommandolinjen.

Med disse linjer, der brugte jpackage til at underskrive, mislykkedes DMG altid. ('Udvikler-id-applikationen:' matchede ikke navnet på mit certifikat.)

ÆNDREDE disse linjer for at slippe "Udvikler-id-applikationen:" og det følgende '+'-tegn. Ved påkaldelse af jpackage brugte det fulde navn på certifikatet som parameterværdien:

--mac-signing-key-user-name "3rd Party Mac Developer Application:John Smith (ABCDEFGHIJ)"

og jpackage vil nu (tilsyneladende) bygge og underskrive DMG. Har ikke faktisk forsøgte at indsende dette til Apple Store, så det kan stadig være ufuldstændigt.

Interessant nok er MacAppStoreBundler.java kilden indeholder de korrekte "3rd Party Mac Developer Application:" og "3rd Party Mac Developer Installer:" præfiksstrenge, så de mistænker, at jpackager faktisk påberåber sig de forkerte metoder - men har endnu ikke løst det. Muligvis skal jpackage have nogle ekstra parametre for at specificere præcis, hvad der skal gøres (men du skulle tro, at '--type dmg' ville påberåbe sig den korrekte logik).

Grundlæggende (klodsede) trin til at reproducere:

  • Download kilde fra https://hg.openjdk.java.net/jdk (valgt jdk14, commit 6c954123ee8d).
  • Download og udpak .zip (eller .gz eller .bz2) i en arbejdsmappe
  • Brug en hvilken som helst teksteditor til at følge stien fra 'src' og skift MacAppBundler.java som nævnt ovenfor.
  • Åbn terminalvinduet, og cd ind i 'src'-mappen
  • kør 'make all' for at kompilere hele JDK 14
  • kør src/build/macosx-x86_64-server-release/images/jdk/bin/jpackage ...parameters...

Java tag