Unser automatisierter Build läuft auf Jenkins. Der Build selbst wird auf Slaves ausgeführt, wobei die Slaves über SSH ausgeführt werden.
Ich erhalte eine Fehlermeldung:
00:03:25.113 [codesign-app] build/App.app: User interaction is not allowed.
Ich habe jeden Vorschlag ausprobiert, den ich bisher in anderen Posts hier gesehen habe:
- Verwenden Sie den Sicherheits-Unlock-Schlüsselbund unmittelbar vor dem Signieren, um den Schlüsselbund zu entsperren.
- Verschieben des Signaturschlüssels in einen eigenen Schlüsselbund.
- Verschieben des Signaturschlüssels in den Anmeldeschlüsselbund.
- Verschieben des Signaturschlüssels in den Systemschlüsselbund.
- Manuelles Festlegen von Listen-Schlüsselanhängern nur für den Schlüsselbund, der den Schlüssel enthält.
In allen Fällen erhalte ich den gleichen Fehler.
Bei dem Versuch, das Problem zu diagnostizieren, habe ich versucht, den Befehl "Security Unlock-Keychain" auf meinem lokalen Terminal auszuführen, und festgestellt, dass der Schlüsselbund dadurch nicht entsperrt wird. Wenn ich in Keychain Access nachschaue, ist das Schlosssymbol immer noch vorhanden. Dies ist der Fall, unabhängig davon, ob ich das Kennwort in der Befehlszeile übergebe oder ob ich dazu aufgefordert werde. Wenn Sie denselben Schlüsselbund über die GUI entsperren, werde ich zur Eingabe des Kennworts aufgefordert und anschließend entsperrt. Außerdem, wenn ich „Sicherheitsschloss-Schlüsselband“ laufen, ich tue um die Tastensperre sehen unmittelbar nach dem Ausführen des Befehls. Dies lässt mich denken, dass das Entsperren des Schlüsselbunds nicht wirklich funktioniert. Ich habe das gleiche Verhalten bei Lion (das wir für die Build-Slaves verwenden) und Mavericks (das ich entwickle).
Als nächstes habe ich versucht, allen Sicherheitsbefehlen -v hinzuzufügen:
list-keychains "-d" "system" "-s" "/Users/tester/.secret/App.keychain"
Listing keychains to see if it was added: ((
"/Library/Keychains/System.keychain"
))
unlock-keychain "-p" "**PASSWORD**" "/Users/tester/.secret/App.keychain"
build/App.app: User interaction is not allowed.
Aus diesem Grund scheint es, dass List-Keychains nicht funktionieren. Vielleicht funktioniert beides nicht. : /
Hier gibt es eine ähnliche Frage . Die Lösung ist interessant - setzen Sie "SessionCreate" in launchctl auf true. Aber ich baue nicht auf dem Master auf - mein Erstellungsprozess wird von SSH auf einer Slave-Erstellungsmaschine gestartet. Vielleicht gibt es eine Befehlszeilenmethode, um das zu tun, was launchctl tut, wenn Sie "SessionCreate" ausführen?
quelle
Antworten:
Auch ich habe dagegen gekämpft. Nichts half, bis ich den Vorschlag auf http://devnet.jetbrains.com/thread/311971 ausprobierte . Vielen Dank, Ashish Agrawal!
Melden Sie Ihren Build-Benutzer über die GUI an und öffnen Sie den Schlüsselbundzugriff. Wählen Sie Ihren privaten Signaturschlüssel aus, klicken Sie mit der rechten Maustaste, wählen Sie "Informationen abrufen", wechseln Sie zur Registerkarte "Zugriffssteuerung" und wählen Sie "Allen Anwendungen erlauben, auf dieses Element zuzugreifen".
quelle
codesign
Liste "Immer zulassen" hinzufügen zu können.security unlock-keychain
Zeug auchNun, ich schätze, ich kann heute meine eigene Frage beantworten, denn nachdem ich über zweieinhalb Tage darauf gestochen habe, scheint eines der Dinge, die ich versucht habe, funktioniert zu haben. Ich werde mich jetzt einfach zurückziehen und hoffe, dass es weiter funktioniert.
Im Wesentlichen sieht es so aus, als ob es darauf ankommt,
-d system
nicht wirklich zu funktionieren. Daher sollten wahrscheinlich viele Antworten auf andere Fragen hier aktualisiert werden, um dies widerzuspiegeln.quelle
codesign
über ssh zuzugreifen, ohne das Anmeldekennwort in einem Skript zu speichern..env
Datei nicht so schlecht, da die.env
Datei bereits vertrauliche Schlüssel für z. AWS und Heroku. In unserem Fall werden die Build-bezogenen Codezeichen-Anmeldeinformationen in einem neu erstellten Schlüsselbund gespeichert, der nach dem Build entfernt wird. Dann wird es für den nächsten Build erneut erstellt. Derlogin
Schlüsselbund muss jedoch noch geöffnet werden, ebensosecurity unlock-keychain -p pass login.keychain
das fehlende Glied hier. Vielen Dank!Keine der anderen Antworten hat bei mir funktioniert.
Was mich schließlich gerettet hat, war dieser Beitrag
Zusammenfassend kann dies durch ein Standardzeitlimit von 5 Minuten verursacht werden, das diesen Fehler nach einem langen Build auslöst.
Reparieren:
quelle
Confirm
auch nachdem ich den Zugriff geändert habe. : /Versuchen Sie,
security unlock-keychain
undcodesign
als einzeiligen Befehl aufzurufen . Das hat mir geholfen. Etwas wie:quelle
sshexec
und jedes Mal wird eine neue SSH-Sitzung erstellt.Verwenden von Sicherheit zum Erstellen eines Schlüsselbunds für / usr / bin / Codesign
Das Zertifikat zu importieren und programmgesteuert mit Codesign arbeiten zu lassen, bedeutet nicht, Login- oder System-Schlüsselanhänger zu verwenden oder zu einem Gott des Codesigns zu beten. Sie müssen nur die richtigen Berechtigungen festlegen. Ich empfehle, einen neuen Schlüsselbund speziell für Codesign-Zwecke zu erstellen.
In diesen Tagen zu erhalten ,
codesign
um nicht nachgebenerrSecInternalComponent
müssen Sie die Partitionsliste (ACLs) korrekt zu erhalten. Ich werde durch die Stufen gehen:Erstellen Sie den Schlüsselbund
Zu diesem Zeitpunkt ist der Schlüsselbund entsperrt, wird jedoch nicht angezeigt
Keychain Access
.Fügen Sie den neuen Schlüsselbund zur Suchliste hinzu
Fügen Sie den neuen Schlüsselbund zur Liste hinzu. Wenn Sie die ursprüngliche Liste nicht zuerst herausnehmen, haben
list-keychains
Sie sie nicht mehrlogin.keychain
in Ihrer Suchliste.Entsperren Sie den Schlüsselbund
Dies ist redundant, wenn Sie den obigen Schlüsselbund erstellt haben. Wenn der Schlüsselbund jedoch bereits vorhanden ist, ist dies erforderlich.
Entfernen Sie die Standardeinstellungen aus dem Schlüsselbund
Wenn Sie keine Argumente angeben, wird das Zeitlimit für die automatische Sperre auf unbegrenzt gesetzt und die automatische Sperre im Ruhezustand entfernt.
Importieren Sie Ihre Signaturzertifikate von einer .p12
Importieren Sie die Zertifikate und gewähren Sie
codesign
Zugriff über die-T
Option.Legen Sie die ACL am Schlüsselbund fest
Dies ist eine Anforderung, die viele Menschen vermissen. Sie können sehen, was macOS macht, indem Sie den Dump-Schlüsselbund verwenden. Was im Fall von Codesigning erfordert
apple:
undapple-tool:
.-s
bezieht sich auf das Signieren von Zertifikaten.Gitlab-Runner, Jenkins und dergleichen
Eine sehr wichtige Sache für jeden CI-Runner oder jedes Build-System ist es, sicherzustellen, dass der Prozess
launchd
korrekt gestartet wird. Stellen Sie sicher, dass Ihre Liste enthält<SessionCreate> </true>
.Wenn der Eigentümer des Schlüsselbunds nicht korrekt mit dem Erstellungsprozess übereinstimmt und sichergestellt wird, dass eine Sicherheitssitzung erstellt wird, kann dies zu Kopfschmerzen führen. Diagnostisch gesehen können Sie vorstellen,
list-keychains
ob die Ausgabe Ihren Erwartungen entspricht.Dies ist von der
launchd.plist
Manpage:SessionCreate <boolean>
UserName <string>
GroupName <string>
Endlich Codesign
Sie können den Hash der Signaturzertifikate mit nachschlagen
find-identity
Codesignieren Sie ein Framework, eine Dylib usw.
Codesignieren Sie das App-Bundle
Schlussbemerkungen - Wenn Sie sich ansehen, wie Xcode dies tut, wird festgelegt
CODESIGN_ALLOCATE
, dass der in Xcode enthaltene verwendet wird, nicht in/usr/bin
.Der Suchpfad ist auf festgelegt
${PLATFORM_PATH}:${TOOLCHAIN_PATH}:${PATH}
, wobei der PLATFORM-Pfad das Verzeichnis / usr / bin für das angegebene Ziel-SDK und TOOLCHAIN_PATH das Verzeichnis / usr / bin für die Xcode-Host-Tools ist.quelle
Legen Sie Ihre Schlüssel in den Systemschlüsselbund
quelle
Das ist also der Befehl, der funktioniert.
-A
soll verhindern, dass der Mac nach dem Passwort fragt. Für den Import in system.keychain ist keine GUI erforderlich.sudo security import <cert.p12> -k "/Library/Keychains/System.keychain" -P <passphrase> -A
quelle
Mein Schlüsselbund war verschlossen. Es widerstand meinen Fortschritten, diese Tatsache zu ändern ...
Keychain Access
->Keychain First Aid
->Repair
, et voilá !quelle
Das Entsperren des Schlüsselbunds reicht nicht aus. Sie müssen auch den Zugriff auf den privaten Schlüssel auf "Allen Apps den Zugriff auf dieses Element erlauben" setzen. Um dies über die Befehlszeile zu tun, muss der Schlüssel erneut importiert werden. Also, um Dinge auf einmal zu nehmen:
Entsperren Sie den Anmeldeschlüsselbund, wenn er gesperrt ist. Es sollte zwar nicht gesperrt sein, aber so machen Sie das:
Wenn auf Ihrem Buildcomputer der Anmeldeschlüsselbund gesperrt ist und Sie dieses Kennwort nicht in einem Skript verfügbar machen möchten, sollten Sie einen anderen Schlüsselbund verwenden. Sie können eine sofort erstellen und diese im vorherigen und folgenden Befehl verwenden. So erstellen Sie eine vor Ort:
Importieren Sie dann Ihre Zertifikate und zugehörigen privaten Schlüssel mit dem Parameter -A in den Anmeldeschlüsselbund. Beachten Sie, dass Sie für all dies kein Sudo benötigen ...
Mit dem Parameter -A wird Ihr privater Schlüssel auf "Alle Apps dürfen auf dieses Element zugreifen" gesetzt.
Wenn Sie all diese Funktionen verwenden, sollten Sie in der Lage sein, ein Skript zu erstellen, das das erforderliche Zertifikat installiert, um eine Release-IPA zu erstellen und ohne Aufforderung zu signieren. Sie können die .p12-Datei in Ihrem Repo speichern, sodass jeder Computer Ihre IPA erstellen kann, ohne dass eine manuelle Einrichtung erforderlich ist.
quelle
Abgesehen vom Entsperren des Schlüsselbunds (wie in anderen Antworten erwähnt) müssen Sie den Zugriff aller Anwendungen auf das Xcode-Authentifizierungstoken im Schlüsselbund zulassen:
quelle
Importieren Sie Ihre Schlüssel in den Systemschlüsselbund. Sie können diesen Befehl verwenden:
quelle
Also habe ich hier jede Antwort ausprobiert und etwas stimmte nicht ganz. Als ich meinen CI-Dienst neu startete, stellte ich schließlich fest, dass er unter einem anderen Benutzer ausgeführt wurde, als ich erwartet hatte. Der Wechsel zu dem Benutzer, der tatsächlich Zugriff auf den Schlüssel in seiner Anmeldekette hatte, hat alles behoben. Dies ist möglicherweise kein häufiges Problem, wollte aber meinen spezifischen Grund für diesen Fehler dokumentieren, falls es anderen passiert.
quelle
Für mich scheint nichts geklappt zu haben, Xcode neu zu installieren. Jenkins gibt immer wieder den gleichen Fehler. Sie würden viel Zeit sparen, wenn Sie die Xcode-Installation einfach in den Papierkorb verschieben und neu installieren. Stellen Sie sicher, dass Sie den Befehl Codesign mindestens einmal über die Befehlszeile ausführen.
Auch wenn Sie den gleichen Fehler erhalten, versuchen Sie, "Schlüsselbund entsperren?" Eigenschaft in Jenkins und geben Sie den Pfad zu Ihrer login.keychain unter /Users/${USER}/Library/Keychains/login.keychain an
Ich hoffe, Gott ist danach bei dir.
quelle
In meinem Fall wurde dies dadurch verursacht, dass ein Schlüsselbund mit einem Standardzeitlimit von 300 Sekunden und einer langen Xcode-Kompilierung von mehr als 300 Sekunden erstellt wurde. Die Problemumgehung bestand für mich darin, Folgendes aufzurufen:
security set-keychain-settings -t <longer timeout in seconds> <keychain>
unmittelbar nach dem Erstellen des temporären Schlüsselbunds.
quelle
Ich habe all diese Vorschläge durchgearbeitet und hatte immer noch Probleme, Fastlanes
gym
in einem Jenkins-Job zu verwenden. Ich hatte das Zertifikat installiert und den Schlüsselbund entsperrt und konnte auf dem Slave Codesignieren, als ich den Befehl Codesign in der Befehlszeile manuell ausführte.Umgehung: Wenn Jenkins über JNLP anstelle von SSH eine Verbindung zum Slave herstellt, können Sie ein Codesign erstellen.
quelle
Bei mir passiert es, wenn ein zweiter Schlüsselbund manuell hinzugefügt und gesperrt wird. Aus irgendeinem Grund wird
codesign
versucht, auf den gesperrten Schlüsselbund zuzugreifen, und dies schlägt fehl, obwohl sich die Zertifikate im Anmeldeschlüsselbund befinden (und entsperrt sind). Das Entsperren des zweiten löst das Problem. Macht für mich einfach keinen Sinn.quelle
Nachdem Sie eine Reihe der oben genannten Lösungen ausprobiert haben. Ich erkannte, dass ein Faktor, den ich hatte, war, dass ich den Build mit der ION-Konsole startete. Als ich wieder zum Erstellen über die Terminal-App wechselte, funktionierte alles einwandfrei.
quelle