So signieren Sie Apps für macOS Catalina 10.15

Bild

[Anmerkung Übersetzung: Als ich den Beitrag übersetzte, der eine breite Diskussion über Habré auslöste, interessierte ich mich für die neuen Regeln für Softwareentwickler, die von Apple eingeführt wurden. Dieser Artikel spricht über die persönliche Erfahrung, die Regeln mit einem der Spieleentwickler zu beherrschen.]

Einführung


In der neuen Version von macOS stellte Apple bestimmte Anforderungen an Anwendungen, die früher Empfehlungen waren: ausführbare 64-Bit-Dateien, Signatur und Beglaubigung. Anwendungen, die diese Anforderungen nicht erfüllen, werden nicht mehr gestartet.

Dies geschieht, um die Arbeit der Benutzer zu schützen und die Verbreitung von Schadprogrammen zu verhindern. Gleichzeitig wird das Leben jedoch sehr schwierig, insbesondere für diejenigen Personen, für die der Mac nicht die Hauptentwicklungsplattform ist, die jedoch den Mac starten oder weiterhin unterstützen möchten .

Dies gilt insbesondere für Spieleentwickler, die Mac-Spiele auf Steam veröffentlichen. Bis zu den letzten Änderungen mussten von Steam gestartete Spiele nicht unterschreiben und notariell beglaubigen, aber jetzt müssen sie die gleichen Regeln wie alle anderen befolgen.

Ich habe gerade herausgefunden, wie ich diese Anforderungen für mein Spiel Luftschiffe: Erobere den Himmel implementieren kann. Luftschiffe arbeiten in Java und erfordern daher eine JVM, aber im Allgemeinen ist alles andere für die meisten Entwickler anwendbar.

Folgendes habe ich über das Signieren und Beglaubigen einer Mac-App gelernt, die nicht direkt von Xcode kompiliert wurde. Bitte beachten Sie, dass die Informationen aus meiner eigenen Forschung stammen und möglicherweise nicht 100% genau sind. Fragen und Korrekturen sind willkommen.

Hintergrund


Dieser Artikel beschreibt die Unterzeichnung und Beglaubigung. Das Abrufen der ausführbaren 64-Bit-Datei des Programms ist Aufgabe Ihres Compilers oder Ihrer Entwicklungsumgebung.

Unter macOS werden Anwendungen normalerweise in Bundle-Ordnern gepackt, die die ausführbare Datei sowie zusätzliche Ressourcen und Metadaten enthalten. Das Signieren eines Bundles bedeutet das Erstellen einer kryptografischen Prüfsumme des Inhalts des Bundles, gefolgt vom Erstellen einer kryptografischen Signatur mit einem Zertifikat, das Apple dem Entwickler ausstellt. Eine Unterschrift ist eine Erklärung, dass Sie persönlich das korrekte Verhalten der Anwendung garantieren. Wenn sich der Inhalt des Bundles ändert, ändert sich die Prüfsumme und die Signatur entspricht nicht mehr diesen, wodurch das Betriebssystem gewarnt wird, dass nicht autorisierte Änderungen am Bundle vorgenommen wurden.

Das Signieren von Anwendungen gibt es schon seit vielen Jahren. Wenig später wurden auch Anträge zur Beglaubigung erforderlich. Beglaubigung bedeutet, dass Sie eine signierte Apple-Anwendung einreichen und das Unternehmen zusätzliche Prüfungen durchführt und die Anwendung registriert. Wenn die Beglaubigung erfolgreich ist, „kleben“ Sie die Beglaubigung an Ihre Anwendung, sodass Offline-Computer ohne Internetzugang auch sicherstellen können, dass die Anwendung notariell beglaubigt wurde.

Dies ist eine Art Metapher für die Arbeit mit Papierdokumenten. Der Entwickler sammelt in einem Bündel alle Teile, aus denen die Anwendung besteht. Anschließend erstellt er eine Liste aller Elemente des Bundles (Prüfsumme) und signiert diese Liste (mit einer digitalen Signatur), die er auf das Bundle klebt. Dann übergibt er das unterschriebene Bündel an den Notar Herrn Yablokov, der prüft, ob mit dem Bündel alles in Ordnung ist, und registriert es dann. Er gibt dem Entwickler eine Quittung, die der Hefter am Bundle anbringt. Das heißt, wenn der Entwickler sagte, dass die Anwendung sicher ist, und Herr Yablokov auch sagt, dass sie sicher ist, dann ist es höchstwahrscheinlich. Und wenn eine schlechte Person versucht, ihren Inhalt zu ändern, entspricht die Liste der Bundle-Elemente nicht mehr dem Inhalt, und der Benutzer weiß, dass es nicht erforderlich ist, ihn zu verwenden.

Anforderungen


Was ist für die Unterzeichnung und Beglaubigung des Antrags erforderlich:

  • Ein Mac-Computer, der neu genug ist, um Xcode 11 darauf auszuführen, dh neu genug, um macOS 10.14.3 auszuführen. Wenn Sie Xcode noch nicht installiert haben, sind für die Installation 25 GB freier Speicherplatz erforderlich.
  • Wenn Sie noch kein offizieller Apple-Entwickler sind, sind für die Mitgliedschaft ein Apple ID-Login und ca. 110 US-Dollar erforderlich.

Zwei-Faktor-Authentifizierung


Wenn Sie noch keine haben, aktivieren Sie die Zwei-Faktor-Authentifizierung für Ihre Apple ID. Dies kann von jedem i-Gerät oder von einem Mac aus erfolgen. Rufen Sie auf einem Mac die iCloud-Systemsteuerung der Systemeinstellungen auf. Oben sollte sich ein Panel befinden, das vorschlägt, 2FA zu aktivieren.

Mitgliedschaftskauf


Melden Sie sich mit Ihrer Apple ID bei https://developer.apple.com/ an und wechseln Sie zur Registerkarte Mitgliedschaft. Kaufen oder aktualisieren Sie bei Bedarf Ihre Apple Developer Program-Mitgliedschaft. Bitte beachten Sie, dass die Bearbeitung eines Kaufs auf den internen Systemen von Apple einige Zeit in Anspruch nimmt. Wenn Sie also keine Zertifikate erstellen können (siehe unten), trinken Sie eine Weile eine Tasse Tee und beruhigen Sie sich.

Anwendungs-ID


Möglicherweise müssen Sie die Anwendungspaket-ID im Backend des Entwicklers registrieren. Die Bundle-ID finden Sie in YourApp.app/Contents/Info.plist. (Sie können Anwendungspakete öffnen, indem Sie mit der rechten Maustaste darauf klicken und "Paketinhalt anzeigen" auswählen.) Die Kennung sollte com.yourcompanyname.applicationname lauten. Beispielsweise hat mein Spiel Airships com.zarkonnen.airships.

Um eine ID zu registrieren, melden Sie sich bei https://developer.apple.com/ an , wählen Sie im linken Bereich "Zertifikate, IDs und Profile" und dann auf der nächsten Seite "Kennungen". Anschließend können Sie auf die Schaltfläche „+“ klicken, um die Anwendungskennung hinzuzufügen.

Anwendungskennwort


Um über die Befehlszeile zu signieren, benötigen Sie das Anwendungskennwort. Gehen Sie also zu https://appleid.apple.com/account/manage und generieren Sie es.

Xcode und Tools


Installieren Sie Xcode über den App Store der Mac App. Installieren Sie dann auch die Xcode-Befehlszeilentools unter https://developer.apple.com/download/more . Sie benötigen Befehlszeilentools für Xcode 11 oder die von Ihnen verwendete Version von Xcode.

Zertifikat


Starten Sie Xcode, gehen Sie zu Einstellungen und öffnen Sie die Registerkarte Konten. Fügen Sie bei Bedarf Ihre Apple ID zur Liste der Konten hinzu. Klicken Sie dann unten rechts auf die Schaltfläche "Zertifikate verwalten ...". Die Zertifikate, die Sie zum Signieren von Anwendungen haben, werden angezeigt. Sie benötigen ein Zertifikat "Developer ID Application". Wenn es nicht in der Liste enthalten ist, erstellen Sie es. Klicken Sie im Fenster "Einstellungen: Konten" auf "Fertig" und dann auf "Herunterladen", um die Zertifikate lokal herunterzuladen.

Anwendungsvorbereitung


Damit die Anwendung auf dem neuen System ordnungsgemäß funktioniert, müssen die ausführbare Datei und die Bibliotheken 64-Bit sein.

Darüber hinaus führt Mac OS einen Vorgang namens "Translokation" aus: Aus Sicherheitsgründen wird das ausgeführte Anwendungspaket an einen zufälligen Speicherort verschoben. Bei meiner Anwendung äußerte sich dies darin, dass die neben dem Anwendungspaket befindlichen Datendateien nicht gefunden werden konnten. Sie können den ursprünglichen Speicherort des Bundles der Anwendung ermitteln, aber ich habe das Problem gelöst, indem ich einfach alles in das Bundle eingefügt habe.

Berechtigungen (Ansprüche)


Hierbei handelt es sich um spezielle Berechtigungen, die vom Entwickler zusammen mit der Codesignatur hinzugefügt wurden, damit signierte Anwendungen bestimmte Aktionen ausführen können. Wenn Sie die Anwendung mit Xcode kompilieren, erledigt sie alles selbstständig. Andernfalls müssen Sie eine Plist-Datei erstellen, die alle erforderlichen Berechtigungen enthält. Plist-Dateien können mit Xcode erstellt werden. Unter https://developer.apple.com/documentation/bundleresources/entitlements finden Sie eine Liste der Berechtigungen.

Um eine neue Plist-Datei mit Xcode zu erstellen, wählen Sie "Neue Datei" und klicken Sie dann in der angezeigten Liste auf "Eigenschaftsliste". Fügen Sie dem Stammwörterbuch die Elemente mit den Berechtigungen hinzu, die Sie benötigen. Sie haben die Bedeutung boolesch: JA.


Bei meinem Spiel benötigte ich, da es in Java geschrieben ist, die folgenden Berechtigungen, damit die JVM funktioniert: com.apple.security.cs.allow-jit, com.apple.security.cs.allow-unsigned-executeable-memory, com. apple.security.cs.disable-ausführbarer-Seitenschutz, com.apple.security.cs.disable-Bibliotheksvalidierung, com.apple.security.cs.allow-dyld-Umgebungsvariablen. Für den Benutzer sehen sie einschüchternd aus. Wenn Sie sie also nicht benötigen, fügen Sie sie nicht hinzu.

Später in diesem Artikel gehen wir davon aus, dass Sie Ihre Berechtigungen in einer Datei namens berechtigungen.plist abgelegt haben.

Unterschreiben


Dies ist der Prozess der Erstellung einer digitalen Signatur, die informiert: Derjenige, der Zugriff auf das Signaturzertifikat hat, verspricht, dass dieses bestimmte Anwendungspaket zuverlässig und nicht böswillig ist. Alle Änderungen im Bundle der Anwendung (außer dem Anhängen einer Beglaubigungsbestätigung, siehe oben) nach dem Signieren machen die Signatur ungültig und erfordern eine erneute Signatur des Bundles.

Dies bedeutet auch, dass Ihre Anwendung nichts am Inhalt des Anwendungspakets ändern sollte, z. B. keinen Cache dort ablegen.

Jede ausführbare Datei und dynamische Bibliothek im Anwendungspaket wird separat signiert. In einigen Fällen sind Bibliotheken möglicherweise bereits signiert. Das heißt, es ist höflicher und ruhiger, ein Bündel zu signieren, indem jedes Element der Reihe nach signiert wird, und dann das gesamte Bündel zu signieren. Wenn ein Element bereits eine Signatur hat, bleibt es an seiner Stelle.

Eine grobe, aber effektive Methode besteht darin, eine tiefe Signatur zu erzwingen. Das heißt, Ihre Signatur wird auf alle Elemente des Anwendungspakets angewendet und ersetzt alle vorherigen Signaturen. Genau das werden wir tun, weil es einfacher ist und weil frühere Signaturen möglicherweise ungültig oder nicht stark genug sind.

Sie benötigen den folgenden beängstigenden Befehl:

codesign -s "Developer ID Application: <YourName>" --timestamp --options runtime -f --entitlements entitlements.plist --deep YourApp.app

Die Option --timestamp bedeutet, dass ein gültiger Zeitstempel, der für eine erfolgreiche Beglaubigung erforderlich ist, in die Signatur eingebettet ist.

Die Option --options runtime bedeutet, dass die Signatur "gehärtete Laufzeit" enthält, die auch für eine erfolgreiche Beglaubigung erforderlich ist.

Sie können die Unterschrift vom Team lernen

codesign -d -vvvv YourApp.app

Sie sollten die Anwendung auch ausführen, um sicherzustellen, dass sie nach dem Signieren weiterhin funktioniert.

Wenn Sie Elemente höflicher signieren möchten, entfernen Sie die Befehle -f und --deep aus dem Befehl, signieren Sie zuerst alle ausführbaren Dateien und Bibliotheken in der Anwendung und dann die gesamte Anwendung.

Beglaubigung


Nach dem Signieren der Anwendung müssen Sie sie Apple-Systemen zur Beglaubigung zur Verfügung stellen, um zu sagen: "Schauen Sie, ich habe dieses Ding signiert."

Komprimieren Sie dazu zunächst die Anwendung mit dem Befehl ditto in eine spezielle Zip-Datei:

/usr/bin/ditto -c -k --keepParent YourApp.app YourApp.zip

Das einfache Umschließen der Anwendung mit dem Finder oder der Befehlszeile in zip funktioniert nicht.

Dann senden Sie eine Postleitzahl zur Beglaubigung:

xcrun altool --notarize-app --primary-bundle-id "<id>" -u "<appleid>" -p "<app-specific password>" --file YourApp.zip

Ein Beispiel:

xcrun altool --notarize-app --primary-bundle-id "com.zarkonnen.airships" -u "dave@hotmail.com" -p "bwnh-pbbt-llpt-xxxx" --file Airships.zip

Die Bundle-ID finden Sie unter YourApp.app/Contents/Info.plist. (Sie können Anwendungspakete öffnen, indem Sie mit der rechten Maustaste darauf klicken und "Paketinhalt anzeigen" auswählen.)

Die Beglaubigung kann eine Weile dauern. Dies sind normalerweise einige Sekunden oder Minuten, aber manchmal kann es eine Stunde sein. Gießen Sie sich mehr Tee oder etwas Stärkeres ein, wählen Sie selbst. Früher oder später werden Sie so etwas bekommen:

No errors uploading 'YourApp.zip'.
RequestUUID = 29926ae6-f551-4d54-b283-e29d6f9b9156


Jetzt können wir den folgenden Befehl verwenden, um den Status des übertragenen Bundles zu überprüfen:

xcrun altool --notarization-info <RequestUUID> -u -u "<appleid>" -p "<app-specific password>"

Ein Beispiel:

xcrun altool --notarization-info 29926ae6-f551-4d54-b283-e29d6f9b9156 -u "dave@hotmail.com" -p "bwnh-pbbt-llpt-xxxx"

Ähnliches wird angezeigt:

           Datum: 2019-10-08 06:59:58 +0000
           Hash: 0774fb95035408bacecebd64935a611ecd27b45ad9cbf3cc1aa48fa1e0eaa649
     LogFileURL: https: //osxapps-ssl.itunes.apple.com/itunes-assets/Enigma123 / ...
         Status: Erfolg
    Statuscode: 0
 Statusmeldung: Paket genehmigt 

Ich wiederhole, die Bestätigung dauert normalerweise ungefähr 15 Minuten, aber manchmal dauert es mehrere Stunden für dieselbe Anwendung. Ja so.

Wenn der Status "Fehler" lautet, werden die Fehler angezeigt, die in der URL der Protokolldatei aufgeführt sind. Wenn Sie Erfolg haben, werfen Sie trotzdem einen Blick darauf, da möglicherweise Warnungen vorhanden sind und diese Warnungen möglicherweise zu Fehlern werden, wenn Apple seine Anforderungen erneut verschärft.

Anhang


Schließlich "befestigen" wir die Bestätigung der Beglaubigung am Anwendungspaket, sodass selbst ein Mac sie ohne Internetverbindung überprüfen kann. Dazu müssen Sie einen überraschend kurzen Befehl ausführen:

xcrun stapler staple "YourApp.app"

Herzlichen Glückwunsch, Sie haben sich angemeldet und die Mac-App notariell beglaubigt. Jetzt können Sie das Anwendungspaket auf eine für Sie bequeme Weise verteilen, wenn es sich dabei nicht ändert.

Java


Wenn Sie mit mir im selben Boot sitzen und das Bundle mit der JVM-Anwendung erweitern müssen, lesen Sie weiter.

Es gibt verschiedene Möglichkeiten, ein JVM-Bundle mit einer Java-Anwendung zu kombinieren. Ich würde den AppBundler empfehlen, eine Ameisenaufgabe, die die ganze Arbeit für Sie erledigt. Ursprünglich konnte der AppBundler von java.net heruntergeladen werden. Dank der Vernachlässigung des Restes der Java-Plattform durch Oracle müssen Sie jetzt die neueste Version von https://github.com/TheInfiniteKind/appbundler herunterladen.

Dort finden Sie die Quellen und die Dokumentation, jedoch nicht jar, da davon ausgegangen wird, dass Sie Maven verwenden. Wenn Sie Maven nicht verwenden, können Sie das Glas hier herunterladen : https://jar-download.com/artifacts/com.panayotis/appbundler

Befolgen Sie die Anweisungen in der Dokumentation auf der Github-Seite, um das Bundle zu konfigurieren. Persönlich verwende ich NetBeans und habe zur Lösung des Problems die folgenden Zeilen in build.xml eingefügt:

 <target name = "- post-jar">
   <taskdef name = "bundleapp" 
     classpath = "lib / appbundler-1.1.0.jar"
     classname = "com.oracle.appbundler.AppBundlerTask" />
   <bundleapp 
       jvmrequired = "1.7"
       outputdirectory = "/ home / zar / Desktop"
       name = "Luftschiffe"
       displayname = "Luftschiffe"
       executeableName = "Luftschiffe"
       identifier = "com.zarkonnen.airships"
       Shortversion = "1"
       version = "1"
       mainclassname = "com.zarkonnen.airships.Main"
       copyright = "2019 David Stark"
       applicationCategory = "public.app-category.games">
       <classpath dir = "dist" />
       <runtime dir = "/ home / zar / Desktop / jdk-11.0.4.jdk / Contents / Home" />
       <arch name = "x86_64" />
       <option value = "- Dapple.laf.useScreenMenuBar = true" />
       <option value = "- Dcom.apple.macos.use-file-dialog-packages = true" />
       <option value = "- Dcom.apple.macos.useScreenMenuBar = true" />
       <option value = "- Dcom.apple.mrj.application.apple.menu.about.name = Luftschiffe" />
       <option value = "- Xdock: name = Luftschiffe" />
       <option value = "- Dcom.apple.smallTabs = true" />
       <option value = "- Dfile.encoding = UTF-8" />
       <option value = "- Xmx1024M" name = "Xmx" />
   </ bundleapp>
 </ target> 

Dies ist die Aufgabe, die nach dem Erstellen der JAR-Datei ausgeführt wird. Es verwendet appbundler-1.1.0.jar, um ein Anwendungspaket mit einer eingebetteten JVM zu erstellen.

Das von mir verwendete JDK kann von https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html heruntergeladen werden. Ich habe Version 11 gewählt, weil es LTS (Langzeitunterstützung) hat, aber die alten Oracle-Lizenzbedingungen verwendet, während Version 13 seltsame neue Lizenzbeschränkungen aufweist.

Es gibt auch mehr legal kostenlose OpenJDK-JVMs, aber ich konnte sie nicht dazu bringen, mit dem App-Bundler zu arbeiten.

Hinweis: JVM ist "Java Virtual Machine". JRE ist eine „Java-Laufzeitumgebung“, die die JVM sowie zusätzliche Elemente wie den Java-Updater enthält. JDK ist ein „Java Development Kit“, das aus einer JRE und den zum Schreiben von Java-Programmen erforderlichen Dingen wie einem Compiler besteht. Vor Java 8 war die JRE für Endbenutzer separat verfügbar, aber seitdem ist nur das JDK verfügbar. Daher verknüpfen wir die Java-Entwicklungsumgebung mit einem Computerspiel.

Sie sollten in der Lage sein, das resultierende Bundle gründlich zu unterzeichnen und zu beglaubigen. Die AppBundler-Dokumentation enthält eine Reihe zusätzlicher Optionen, z. B. das Hinzufügen eines Symbols, Dateitypzuordnungen und das Generieren einer abgespeckten JVM für die Anwendung.

Weiterführende Literatur



Ergänzung


  • Der Benutzer von Reddit AMemoryOfEternity stellte in den Steam-Entwicklerforen eine Frage, und es stellte sich heraus, dass Benachrichtigungen für Steam-Anwendungen überhaupt nicht erforderlich sind. Sie sollten 64-Bit sein, aber es ist unklar, ob es obligatorisch ist, sie zu signieren. Link, erfordert Zugriff auf Steamworks
  • Apple hat die Notarregeln vorübergehend gelockert, sodass Sie zwar Anwendungen notariell beglaubigen können, die keine gehärtete Laufzeit haben, Unterkomponenten haben, keine Entwickler-ID haben, keine Zeitstempel haben usw. Solche Dinge werden im Notarbericht weiterhin als Warnungen angezeigt. Um sich also um die Zukunft zu kümmern, ist es besser, sie loszuwerden.
  • Laut Valve müssen Sie die Berechtigung com.apple.security.cs.allow-dyld-umgebungsvariablen erteilen, damit die Steam-API funktioniert: „Steam injiziert die Dylib-API über DYLD_INSERT_LIBRARIES, die standardmäßig durch die gehärtete Laufzeit blockiert sind, aber die Dylib-API selbst ist signiert und es muss überprüft werden, also fügen Sie einfach die Berechtigung "com.apple.security.cs.allow-dyld-Umgebungsvariablen" hinzu, um DYLD-Umgebungsvariablen zuweisen zu können.

Source: https://habr.com/ru/post/de471816/


All Articles