Benachrichtigungsverfahren für Elektronenanwendungen für macOS 10.14.5

Mit der Veröffentlichung von macOS 10.14.5 hat Apple einen obligatorischen Notarisierungsprozess für Anwendungen hinzugefügt, bevor diese verteilt werden. Ich möchte Ihnen sagen, was es ist und welche Schwierigkeiten bei diesem Update bei der Entwicklung auf Electron.js aufgetreten sind.



Einführung


2 Jahre nach dem Boom von Electron.js sind alle heißen Holivars darüber, wie schlimm es ist und warum es gebraucht wird, ruhig. Lassen Sie uns sie in den Kommentaren nicht wieder aufleben lassen. Vielen Dank.


Unser Projekt verwendet Electron Builder, um die Anwendung zu erstellen, aber für Electron Packager ist dieses Verfahren ungefähr das gleiche.


Das Projekt selbst ist ein Starter für Cloud-Spiele, über den ein nativer Client gestartet wird, um auf einen Remotecomputer zuzugreifen.


Das Signieren einer Anwendung mit Electron-Builder sieht nicht kompliziert aus, aber der Vollständigkeit halber werde ich kurz auf dieses Verfahren eingehen. Wenn Sie keine Probleme beim Signieren der Anwendung haben, können Sie dieses Kapitel überspringen.


Anwendungssignierung


Um die Anwendung zu signieren, müssen wir Zertifikate aus dem persönlichen Konto des Apple-Entwicklers exportieren. Wir werden brauchen:


  • Entwickler-ID-Anwendung
  • Entwickler-ID-Installationsprogramm
  • * Mac Developer-Anwendung eines Drittanbieters und Mac Developer Installer eines Drittanbieters (Wenn Sie die Anwendung im AppStore veröffentlichen möchten)

Das Developer ID Installer-Zertifikat wird für eine bestimmte Anwendung ausgestellt, für die diese BundleID erforderlich ist. Für Electron-Builder wird es durch den Parameter appId in package.json angegeben



Zertifikate müssen in einer einzigen Datei gesammelt werden. Fügen Sie sie dazu zum Schlüsselbund hinzu (2 Klicks auf das Zertifikat).
Dann gehen wir zum Schlüsselbund, wählen die erforderlichen Zertifikate aus und klicken im Kontextmenü auf "Elemente exportieren". Nach dem Export erhalten wir eine Datei mit der Erweiterung .p12.



Fügen Sie nach der empfangenen Zertifikatdatei die folgenden Einträge zu den Umgebungsvariablen hinzu


  • CSC_LINK (Pfad zur Zertifikatdatei .p12)
  • CSC_KEY_PASSWORD (Zertifikatzugriffskennwort)

Wenn Sie diese Variablen nicht hinzufügen, sucht der Collector automatisch nach geeigneten Schlüsseln im Schlüsselbund-Repository. Durch Hinzufügen dieser Einträge können Sie die Zertifikate genau bestimmen, die Sie zum Signieren verwenden möchten.


Nach diesen Vorgängen können Sie den Erstellungsprozess starten und alles sollte reibungslos verlaufen.


Dies funktionierte reibungslos, bis macOS 10.14.5 veröffentlicht wurde ....


Was hat sich mit macOS 10.14.5 geändert?


Ein kleiner Exkurs. Als ich nachts die letzte Arbeit an dem neuen Patch durchführte, beschloss ich, die Montage der Produktionsversion am Morgen zu verlassen. Als Sie bemerkten, dass ein Update auf macOS kam, wurde es gestartet und ging in den Ruhezustand.


Am nächsten Morgen war ich überrascht zu sehen, dass die Assembly zum Zeitpunkt des Signierens der Anwendung - "Unnotarized Developer ID" - auf einen unbekannten Fehler zurückzuführen ist.


Verschieben Sie nicht bis morgen, was heute getan werden kann. Benjamin Franklin

Das Wesentliche des Problems


Ab macOS 10.14.5 hat Apple ein obligatorisches Notarisierungsverfahren eingeführt. Apples erster Artikel darüber war im Jahr 2018, aber mit diesem Update wurde dieses Verfahren obligatorisch. Wie sieht sie aus.


Sie sammeln die Anwendung -> senden sie an den Apple Server -> Apple zertifiziert sie -> Gibt den Status der erfolgreichen Zertifizierung zurück -> Der Befehl zum Setzen des Zertifizierungsstempels wird ausgeführt.


Für Entwickler von Xcode müssen Sie nur die Beglaubigung ankreuzen



Der Prozess der Beglaubigung der gesammelten Anwendung kann auch durch einen Befehl im Terminal ausgeführt werden.


$ xcrun altool --notarize-app --primary-bundle-id "com.example.ote.zip" --username "AC_USERNAME" --password "@keychain:AC_PASSWORD" --file OvernightTextEditor_11.6.8.zip 

  • Primär-Bundle-ID - Anwendungs-Bundle-ID
  • Benutzername - Entwickler- Login für Entwickler.apple.com
  • Passwort - "App-spezifisches Passwort". Es kann in Ihrem persönlichen Konto appleid.apple.com unter dem Konto des Entwicklers erstellt werden.

Wenn Sie das Notarisierungsverfahren nicht ausführen, stürzt ein Fenster mit einem Fehler ab, wenn der Benutzer versucht, die Anwendung zu installieren. Gatekeeper ist für die Überprüfung der Sicherheit der Anwendung verantwortlich. Er war es, der die Zusammenstellung der Anwendung über den Elektronenbauer brach.



Wie der Elektronenbildner-Bauprozess aussah


Nach dem Erstellen der Anwendung in der APP-Datei mit dem Dienstprogramm "Electron-Osx-Sign" wurde die Anwendung signiert. Nach dem Signieren mit dem Zertifikat wurde der Prozess zum Überprüfen der Anwendung mit einem Gatekepper gestartet. Mit der Veröffentlichung des Updates begann Gatekeeper jedoch, die korrekte Beglaubigung der Anwendung zu überprüfen, und dies ermöglichte es nicht, den Anwendungssignaturvorgang erfolgreich abzuschließen.



Patch für die Beglaubigung


Github-Benutzer Kallin schlug umgehend eine Lösung vor, indem zwei neue Parameter zu den Einstellungen hinzugefügt wurden. Das erste ist "gatekeeperAssess" - deaktiviert die Assemblyvalidierung nach dem Signieren und das zweite ist "sign" - wodurch das Signieren der Installationsdatei (dmg) mit einem Zertifikat deaktiviert wird. Dieses Commit ist in der Veröffentlichung von Electron-Builder 20.43.0 enthalten.


Für den Notarisierungsprozess selbst verfügt Electron-Userland über ein Electron-Notarize-Modul, das diese Aufgabe ausführt. Sie müssen lediglich ein kleines Skript schreiben und es mit dem afterSign-Hook ausführen.


Antragsunterzeichnung und Beglaubigung



Zunächst müssen Sie überprüfen, ob Sie die Electron-Builder-Version> = 20.43.0 installiert haben, und das Electron-Notarize-Paket installieren.


Fügen Sie den Umgebungsvariablen 2 Einträge hinzu:




Erstellen Sie nun ein Notarisierungsskript, das nach dem Signieren der Anwendung ausgeführt wird.


 const notarize = require('electron-notarize').notarize; module.exports = async (context) => { const { electronPlatformName } = context; if (electronPlatformName === 'darwin') { try { console.log('Try notarize app'); await notarize({ appBundleId: 'APP_BUNDLE_ID', appPath: './dist/mac/APP_NAME.app', appleId: process.env.appleId, appleIdPassword: process.env.appleASP, }); console.log('Success notarize'); } catch (err) { console.log(err); } } }; 

Wir speichern es an einem für Sie geeigneten Ort.


Für eine ordnungsgemäße Beglaubigung müssen wir außerdem die Zugriffsrechte festlegen
zu Systemressourcen für unsere Anwendung. Erstellen Sie dazu die Datei build / berechtigungen.mac.inherit.plist


 <?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.allow-dyld-environment-variables</key> <true/> <key>com.apple.security.cs.disable-library-validation</key> <true/> <key>com.apple.security.cs.disable-executable-page-protection</key> <true/> <key>com.apple.security.cs.debugger</key> <true/> <key>com.apple.security.automation.apple-events</key> <true/> </dict> </plist> 

Der Inhalt der Datei in meinem Fall. Möglicherweise gibt es eine andere Konfiguration für Sie. Beschreibung aller Felder .
Obligatorisch für Electron.js ist - com.apple.security.cs.allow-unsigned-executeable-memory.


Aktualisieren Sie nun die Einstellungen in package.json


Im Abschnitt für macOS:



  • gatekeeperAssess (deaktiviert die Anwendungsvalidierung auf der Seite des Elektronen-Osx-Zeichens)
  • hardenedRuntime (ermöglicht das Erstellen einer Liste von Sicherheitsberechtigungen und des Zugriffs auf Systemressourcen)
  • Berechtigungen (Pfad zur Datei mit den Zugriffsberechtigungen für unsere Anwendung)

Im allgemeinen Abschnitt der Einstellungen für den Elektronenaufbau:



  • afterSign (Pfad zum Notarisierungsskript, das nach dem Signieren der Anwendung gestartet wird)

Wir starten den Montageprozess. Es scheint ein wenig unterbrochen zu sein, aber das Übertragen der Datei auf den Apple Server und das Warten auf eine Antwort dauert einige Zeit (3 bis 10 Minuten).


Der Status von Benachrichtigungen kann im Terminal angezeigt werden, indem der folgende Befehl ausgeführt wird:


$ xcrun altool --notarization-history 0 -u $appleId -p $appleASP


Die Antwort wird in einer Tabelle dargestellt. Das Statusfeld kann den Wert "Prozess", "Genehmigt", "Ungültig" haben.



Wenn der Status "ungültig" ist, können Sie anhand der Anforderungsnummer erkennen, was genau schief gelaufen ist.


$ xcrun altool --notarization-info "RequestUUID" -u $appleId


Das ist der gesamte Prozess der Unterzeichnung und Beglaubigung. Ich hoffe, Sie finden diesen Artikel hilfreich. Vielen Dank.


Kleine Ergänzung


Bei der Übertragung der Anwendung zum Testen wurde ein interessanter Fehler entdeckt. Die über Telegramm eingegangene Bewerbung lehnte den Start einfach ab. Beim Anzeigen der Protokolle wurde festgestellt, dass die Anwendung von Telegram unter Quarantäne gestellt wurde. Aus welchem ​​Grund und wie dies geschah, konnte ich keine Antwort finden. Beim Senden einer Datei über Yandex.Disk (oder auf andere Weise zum Herunterladen über einen Browser) tritt dieses Problem nicht auf.



Nützliche Links


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


All Articles