Das Signieren einer App, die Java enthält, schlägt fehl

Ich versuche, ein App-Bundle zu signieren, das die Java Runtime Environment 8 (JRE) enthält.

Von der Befehlszeile aus führe ich diesen Befehl aus:

codesign -s "Developer ID Application: My Company" /Development/MyApp.app

Ich bekomme diese Ausgabe:

MyApp.app: code object is not signed at all
In subcomponent: /Development/MyApp.app/Contents/PlugIns/jre8/Contents/Home/jre/COPYRIGHT

Das Ergebnis ist, dass das App-Bundle nicht wie erwartet signiert wird.

Wie behebe ich das?

Versuchen Sie, die App in einer Sandbox zu installieren oder sie nur für die Gatekeeper-Akzeptanz und die Verteilung außerhalb des App Store zu signieren?
Letzteres. Ich werde das/die Bundle(s) in einer .dmg-Datei zur Online-Verteilung bereitstellen.

Antworten (1)

Codesignierung

Das benutzerfreundliche Handbuch zum Code-Signieren besagt, dass Sie zuerst die Unterkomponente signieren und es dann erneut mit Ihrer App selbst versuchen sollten:

codesign sagt, dass mein Code nicht signiert ist, wenn ich versuche, ihn zu signieren.

Stellen Sie sicher, dass der gesamte verschachtelte Code bereits signiert und seine Signatur gültig ist. Xcode übernimmt dies für Sie, wenn Sie es Ihre Codesignatur-Aufgaben erledigen lassen.

Es heißt weiter, dass Xcode die gesamte Signierung übernimmt, was hilfreich sein kann oder auch nicht, da Sie sich bereits dafür entscheiden, Dinge von der Befehlszeile aus zu signieren.

--tief

Um den gesamten verschachtelten Code auf einmal zu signieren, fügen Sie das --deepArgument hinzu codesign:

codesign --deep -s "Developer ID Application: My Company" /Development/MyApp.app

Shell-Skript

Eine andere Möglichkeit, dasselbe zu tun, besteht darin, ein Shell-Skript zu erstellen, das den Signaturstatus des verschachtelten Codes überprüft und signiert, falls er fehlt. Auf diese Weise erhalten Sie möglicherweise mehr Kontrolle darüber, was Sie innerhalb des Pakets signieren.

Beispiel:

Ein aufgerufenes Bash-Skript sign-unsigned.sh, das einen Eintrag im Bündel überprüft und signiert, falls er noch nicht signiert ist, könnte folgendermaßen ausgeführt werden:

#!/bin/bash
if codesign --verify $1 ; then 
   exit; 
else
   codesign --sign "$2" $1;
fi

Geben Sie das sign-unsigned.shein /Developmentund tun Sie dies auf der Befehlszeile:

cd /Development/MyApp.app/
find . -exec ../sign-unsigned.sh {} "Developer ID Application: My Company" \;
codesign --sign "Developer ID Application: My Company" ../MyApp.app
Danke @bmike Ich denke, das könnte funktionieren. Trotzdem muss ich auf diese Weise ein Skript (oder etwas Ähnliches) erstellen, das alle Dateien im Bundle einzeln signiert. Wenn ich das nur codesignfür mich tun könnte, wenn ich einen Bundle-Ordner angebe ...
@JoachimBratteli ja - zumindest sagt dir die Fehlermeldung, was du unterschreiben musst. Xcode kann nützlich sein, nur um Ihre App zu packen, wenn Sie feststellen, dass das Erstellen Ihres eigenen Toolsets zum Signieren mühsamer ist als das Einrichten von Build-Phasen, um nur das Paket zusammenzustellen, das Sie dann verteilen werden.
Gelöst. Ich habe dieser Antwort gerade meine Shell-Skript-Lösung hinzugefügt. Ich weiß nicht wirklich, wie ich eine if-Anweisung in den find -exec-Block einbauen soll, also habe ich ein Shell-Skript erstellt, das find aufrufen kann. Nochmals vielen Dank, dass Sie mich in die richtige Richtung gewiesen haben @bmike
Habe gerade in einer anderen Antwort auf Superuser gefunden, dass es nicht möglich ist, das ; der if-Anweisung in einem find, also wäre die Lösung, eine Shell aufzurufen: http://superuser.com/questions/341601/find-with-exec-how-to-perform-multistep-conditional-action-on -jede Datei
Und dann stellte ich fest, dass alles behoben werden konnte, indem einfach das Argument --deep zu hinzugefügt wurde codesign. Das nächste Mal lese ich Manpages "tiefer". Ich habe allerdings etwas über Shell-Scripting gelernt. :-D