Sicherheit / Codesign in Sierra: Keychain ignoriert Zugriffssteuerungseinstellungen und UI-Eingabeaufforderungen

71

Beginnend mit macOS Sierra kann ich keine Codesign-Identität mehr in einen Schlüsselbund mit / usr / bin / security importieren, ohne dass die Benutzeroberfläche usr / bin / Codesign bei Verwendung dieser Identität zum Zugriff auffordert. Dadurch werden die Paketskripte des Buildservers beschädigt. Es scheint keine Problemumgehung zu geben. Dies betrifft benutzerdefinierte Schlüsselanhänger, aber auch die Datei login.keychain.

Reproduktionsschritte: Führen Sie die folgenden Befehle im Terminal aus (für den Import muss eine Signaturidentität verfügbar sein):

security create-keychain -p test buildagent.keychain
security unlock-keychain -p test buildagent.keychain

security list-keychains -d user -s buildagent.keychain
security default-keychain -s buildagent.keychain

security import identity.p12 -k buildagent.keychain -P password -T /usr/bin/codesign

codesign -vfs '$IDENTITY' '${PRODUCT}' --keychain 'buildagent.keychain'

Ergebnis: macOS zeigt eine UI-Eingabeaufforderung an, in der Sie um Erlaubnis gebeten werden, auf den zuvor importierten privaten Schlüssel zuzugreifen.

Ich habe viele Problemumgehungen versucht, aber nichts scheint zu funktionieren:

  • Verwenden der neuen Erweiterung .keychain-db bei der Angabe des Schlüsselbundnamens
  • Verwenden Sie die login.keychain anstelle der benutzerdefinierten
  • Importieren des p12 mit -A ('Jeder Anwendung erlauben, auf den importierten Schlüssel zuzugreifen')
  • Zertifikat und Schlüssel separat importieren (zuvor mit openssl pkcs12 aus dem p12 extrahiert)

Das Importieren der Identität funktioniert definitiv. Ich kann das Zertifikat und den Schlüssel sehen, wenn der Inhalt des Schlüsselbunds in der Anwendung "Schlüsselbundzugriff" angezeigt wird. Die Zugriffssteuerungseinstellung für den privaten Schlüssel ist ebenfalls korrekt konfiguriert (mit der gewünschten Codesign-Ausnahmeregel).

Wie kann ich die UI-Eingabeaufforderung von Sierra vermeiden?

Sven Driemecker
quelle
Momentan musste ich die Benutzeroberfläche einmal herausholen und auf klicken, Always allowdann funktioniert die CLI gut.
Jayatubi
Hallo Jayatubi, das ist eine praktikable Lösung, wenn Sie nur mit wenigen Codesign-Identitäten und demselben Schlüsselbund (z. B. login.keychain) arbeiten. Mein Unternehmen muss jedoch Dutzende verschiedener Codesign-Identitäten verwalten und bevorzugt die Verwendung von Schlüsselketten pro Build, da dadurch das Risiko beseitigt wird, dass der Build beschädigt wird, da mehrere Identitäten mit ähnlichen Namen im selben Schlüsselbund verfügbar sind.
Sven Driemecker
Ich habe eine seltsame Sache bemerkt. Wenn die Benutzeroberfläche dazu auffordert, fragen Sie nach dem permission of private XXX. Dies XXXist jedoch nicht der Name des privaten Schlüssels, sondern der Name der p12Datei. Wenn ich mehr als einen Schlüssel in derselben p12-Datei habe, egal welchen Schlüssel ich verwende, wird immer der Name der p12-Datei angezeigt. Und wenn ich auf always allowalle Tasten im selben p12 klicke, ist das Codesign in Ordnung.
Jayatubi
In meinem Fall war das Problem, dass ich es über SSH tat
Dawid Drozd

Antworten:

146

Der Befehl, den Sie verwenden müssen, lautet wie folgt:

security set-key-partition-list -S apple-tool:,apple: -s -k keychainPass keychainName

Beachten Sie bitte, dass dieses Befehlszeilentool wie die Änderungsmethode der List-Keychains funktioniert. Wenn Sie set-key-partition-list mit einem einzelnen Wert ausführen, werden alle partitionIDs in den Zertifikaten überschrieben. Die übergebenen Werte werden nicht überprüft.

Mit diesem Befehl werden die PartitionIDs (Elemente nach -S durch Komma getrennt) für Schlüssel festgelegt, die für einen bestimmten Schlüsselbund signieren können (-s). Die tatsächliche Partitions-ID, die das Codesignieren ermöglicht, lautet apple:.

Ich weiß nicht, was apple-tool:passiert, da es nicht dokumentiert ist, aber es war dort nach dem Importieren des Schlüssels mit, security importalso behalte ich es, um zu vermeiden, dass Leute beschädigt werden, die den Befehl kopieren und einfügen.

Diese Änderung wurde mit Mac OS Sierra eingeführt und ist nicht dokumentiert (oder zumindest konnte ich keine Dokumentation finden). Ab dem 16. Oktober listet die Manpage für Sicherheit diesen Befehl immer noch nicht auf.

Weitere Informationen finden Sie in diesem Fehlerbericht - http://www.openradar.me/28524119

Ilian Iliev
quelle
1
Vielen Dank, das funktioniert einwandfrei! Wie bist du darauf gekommen? Beim Googeln nach Set-Key-Partition-Liste ist das einzige Ergebnis diese Seite und das referenzierte Radar :)
Sven Driemecker
47
Ich habe das Sicherheitsbefehlszeilentool, das Schlüsselbund-UI-Tool und das securityd rückentwickelt. Zusätzlich habe ich das acltool des Apple Mac OS-Testteams verwendet, um die aktuellen Partitions-IDs zu drucken, die von ihrem Tool festgelegt wurden. AclTools Quellcode finden Sie hier - opensource.apple.com/source/Security/Security-57337.60.2/…
Ilian Iliev
1
Gibt es eine Get-Partition-Liste, um zu sehen, welche Dinge aktuell eingestellt waren?
Jeef
1
@ElliotNelson arbeitet in High Sierra genauso. Habe gerade heute ein neues Setup abgeschlossen.
Miguelr
3
@ElliotNelson arbeitet in Mojave genauso. Habe gerade heute ein neues Setup abgeschlossen.
Yuchen Zhong
31

Der Befehl aus dieser Antwort hat nur den Schlüsselbund für mich entsperrt, aber ich hatte immer noch die UI-Eingabeaufforderung, ob die aktuelle Anwendung den Schlüssel verwenden könnte.

Ich habe die Eingabeaufforderung folgendermaßen verhindert:

Gehen Sie unter Schlüsselbundzugriff zum Schlüsselbund, doppelklicken Sie dort auf alle Schlüssel und aktivieren Sie auf der Registerkarte Zugriffssteuerung die Option "Allen Anwendungen den Zugriff auf dieses Element erlauben".

Geben Sie hier die Bildbeschreibung ein

Ich konnte die neue Schlüsselbunddatei dann auf meinen Jenkins- Buildserver hochladen, wo sie vom Plugin für Schlüsselanhänger und Bereitstellungsprofile entsperrt wird . Der Build ist jetzt erfolgreich signiert.

Wouter
quelle
3
Diese Antwort verdient mehr Gegenstimmen. Alle anderen Lösungen funktionieren nur, wenn die Zugriffssteuerung auf Alle Anwendungen zulassen eingestellt ist.
Pat Butkiewicz
29

Für diejenigen, die dieses Problem mit Travis oder einem anderen CI haben, müssen Sie codesigndie Anwendungs-ID-Liste hinzufügen .

security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k keychainPass keychainName

PS: Ich benutze keychainName.keychain (Hinzufügen .keychain)

Rafael Machado
quelle
2
Das hat bei mir nicht funktioniert. Es scheint nur meinen Schlüsselbund zu entleeren. Als ich versuchte, es mit zu testen codesign --force --sign <identity_hash> $(mktemp), erhalte ich immer noch den Genehmigungsdialog
Heath Borders
Funktioniert dies nur mit temporären Schlüsselanhängern? Ich versuche es mit meinem Login-Schlüsselbund.
Heath Borders
Ich habe mein Schlüsselbundkennwort beim ersten Importieren des privaten Schlüssels nicht angegeben, was dazu führte, dass es set-key-partition-listnicht funktionierte. stackoverflow.com/a/43002580/9636
Heath Borders
1
Bei CircleCI hat das bei mir nicht funktioniert. Der Code-Sign-Befehl hängt (da das Betriebssystem nach einem Passwort fragt). Was funktionierte, war die Antwort von Ilian Iliev oben.
AlunAlun
6

Aus irgendeinem Grund hat das security set-key-partition-listbei mir nicht funktioniert.

Ich habe es mit der Option -A gelöst, als ich das Zertifikat in den Schlüsselbund importierte:

security import ${P12_FILE} -k ${KEYCHAIN_PATH} -P ${P12_PASSWORD} -A

Es ist nicht erforderlich, das security set-key-partition-listdanach zu verwenden.

Mit dieser Option kann jede Anwendung ohne Warnung auf den importierten Schlüssel zugreifen. Daher wird verhindert, dass die Eingabeaufforderung angezeigt wird. Beachten Sie, dass es unsicher ist, da der Schlüssel nicht geschützt ist. Abhängig von Ihrem Build-Kontext kann dies jedoch hilfreich sein.

Darüber hinaus muss der Schlüsselbund zur Suchliste hinzugefügt werden:

security list-keychains -s ${KEYCHAIN_PATH}

Dann sollte der Schlüsselbund entsperrt werden. Andernfalls wird eine Eingabeaufforderung angezeigt, in der Sie nach dem Schlüsselbundkennwort gefragt werden:

security unlock-keychain -p ${KEYCHAIN_PASSWORD} ${KEYCHAIN_PATH}

Schließlich sollte das Zeitlimit für die automatische Sperre deaktiviert werden. Dies ist für den Fall, dass der Build ziemlich lang ist und sich der Schlüsselbund erneut verriegelt:

security set-keychain-settings ${KEYCHAIN_PATH}
Ika
quelle
Interessant. Das hat bei mir damals im Oktober 16 mit Sierra nicht funktioniert. Auf welchem ​​Betriebssystem haben Sie das getestet?
Sven Driemecker
Es wurde auf einem Jenkins-Sklaven mit Sierra 10.12.6
Ika
1

Nachdem ich viele verschiedene Lösungen ausprobiert hatte, funktionierte ich einfach das Passwort meines Schlüsselbunds.

  • Finder> Los> Dienstprogramme
  • Öffnen Sie das Dienstprogramm für den Schlüsselbundzugriff.
  • Ich bin mir nicht sicher, ob ich diesen Schritt ausführen muss: Klicken Sie in der linken Seitenleiste des Dienstprogramms "Schlüsselbundzugriff" auf "Meine Zertifikate". Sehen Sie in der Spalte Schlüsselbund nach, in welchem ​​Schlüsselbund sich Ihr Apple-Entwicklerzertifikat befindet. In meinem Fall befand es sich im Schlüsselbund "Login".
  • Ändern Sie das Kennwort für den Schlüsselbund aus dem vorherigen Schritt. Möglicherweise möchten Sie versuchen, es zu sperren und dann zu entsperren, wenn es gesperrt ist. Sie ändern das Passwort, indem Sie auf den entsprechenden Schlüsselbund klicken (in meinem Fall "Login") und dann im Menü "Bearbeiten" des Dienstprogramms "Schlüsselbundzugriff" die Option "Passwort ändern ..." auswählen.
  • Als ich das nächste Mal den Archivierungsschritt in Xcode (im Menü Produkt) ausführte, wurde ich schließlich zur Eingabe eines Schlüsselbundkennworts aufgefordert und gab das Kennwort für meinen "Login" -Schlüsselbund ein. Dann hat es funktioniert. Als es fertig war, sah ich einen Archivbildschirm mit meiner App.
Arnoldbird
quelle
1

Neben der Verwendung

security set-key-partition-list -S apple-tool:,apple: -s -k keychainPass keychainName

Ich musste auch die Einstellungen für meinen Schlüsselbund auf "kein Timeout" ändern, das von verwendet wurde

security set-keychain-settings keychainName

(Dokumentation verfügbar unter https://ss64.com/osx/security-keychain-settings.html )

Norbert
quelle
0

Ich habe ein paar Tage damit verbracht, nach einer Lösung zu suchen. Das hat nicht geholfen

security import ${P12_FILE} -k ${KEYCHAIN_PATH} -P ${P12_PASSWORD} -A

aber als ich die Apps explizit aufgelistet habe - es hat funktioniert (zumindest auf Catalina)!

security import ${P12_FILE} -k ${KEYCHAIN_PATH} -P ${P12_PASSWORD} -T /usr/bin/codesign -T /usr/bin/productsign
Ivan Krylov
quelle
-3

Auch wenn Ihre App länger als 5 Minuten erstellt wurde, kann Ihnen der benutzerdefinierte Schlüsselbund-Sperr-Timer ausgehen und Sie erhalten den Fehler -1 = ffffffff. Deaktivieren Sie daher die Schlüsselbundsperre als tmp-Lösung.

heilig
quelle