
x509-Zertifikate auf PIV-fähigen YubiKeys verwalten, Schlüssel und Zertifikatsanforderungen erstellen sowie Git-Commits und Dateien signieren oder verifizieren.
Pivit ist ein Kommandozeilenwerkzeug zum Verwalten von x509-Zertifikaten, die auf Smartcards mit PIV-Applet-Unterstützung (Yubikey) gespeichert sind, und zum Verwenden dieser Zertifikate zum Signieren und Verifizieren von Daten.
Es ist vollständig kompatibel mit der Art und Weise, wie die git-Kommandozeile externe Programme zum Signieren und Verifizieren von Commits und Tags aufruft.
brew install pivit
go install github.com/cashapp/pivit/cmd/pivit@latest
Um git so einzurichten, dass pivit zum Signieren und Verifizieren von Signaturen verwendet wird, führen Sie die folgenden Befehle aus:
git config --(local|global) gpg.format x509
git config --(local|global) gpg.x509.program pivit
pivit --reset
Setzt das PIV-Applet des Yubikey zurück und erstellt eine neue PIN für den Zugriff darauf.
pivit --generate [--p256] [--self-sign | --no-csr] [--assume-yes] [--pin-policy] [--touch-policy]
Erzeugt ein neues Schlüsselpaar im Card-Authentication-Slot des Yubikey.
Dieser Befehl erzeugt und speichert außerdem ein x509-Zertifikat für den erzeugten Schlüssel, das von Yubico signiert ist.
Wenn die Option --p256 angegeben wird, wird das Schlüsselpaar mit der elliptischen Kurve P-256 erzeugt.
Andernfalls wird die Kurve P-384 verwendet.
Fügen Sie das Flag --self-sign hinzu, um ein selbstsigniertes Zertifikat zu erzeugen;
das Zertifikat wird mit dem neu erzeugten Schlüssel signiert.
Sie werden aufgefordert zu bestätigen, dass ein selbstsigniertes Zertifikat wirklich gewünscht ist,
dann nach der PIN gefragt und anschließend aufgefordert, Ihren Yubikey zu berühren.
Die Ausgabe enthält am Ende 3 CERTIFICATE-Blöcke anstelle eines CERTIFICATE_REQUEST (Beispielausgabe unten).
Diese Option ist hauptsächlich für Testzwecke nützlich.
Das Flag --assume-yes kann in Kombination mit der Option --self-sign verwendet werden, um deren y/n-Abfrage zu deaktivieren.
Fügen Sie das Flag --no-csr hinzu, um die Ausgabe der Zertifikatsignieranfrage zu überspringen. In diesem Fall werden Sie nicht aufgefordert, Ihren Yubikey zu berühren.
Diese Option ist nützlich, wenn der erzeugte Schlüssel nicht Teil einer bestehenden PKI sein muss.
Sie können das Zertifikat des Schlüssels dennoch mithilfe von Yubicos Zertifikat hier verifizieren.
Das Flag --pin-policy steuert, wann beim Zugriff auf den erzeugten Schlüssel zur Eingabe einer PIN aufgefordert wird.
Setzen Sie es auf einen der Werte never, once oder always (Standard ist never).
Das Flag --touch-policy steuert, wann beim Zugriff auf den erzeugten Schlüssel zum physischen Berühren der Hardware aufgefordert wird.
Setzen Sie es auf einen der Werte never, cached oder always (Standard ist always).
Die Ausgabe des Befehls sieht wie folgt aus:
Printing Yubikey device attestation certificate:
----- BEGIN CERTIFICATE -----
...
----- END CERTIFICATE -----
Printing generated key certificate:
----- BEGIN CERTIFICATE -----
...
----- END CERTIFICATE -----
Printing certificate signing request:
----- BEGIN CERTIFICATE REQUEST -----
...
----- END CERTIFICATE REQUEST-----
Die CERTIFICATE REQUEST am Ende ist mit dem neu erzeugten privaten Schlüssel signiert,
und kann verwendet werden, um ein von einer CA signiertes Zertifikat auszustellen.
Wenn Sie sich dafür entscheiden, ein eigenes Zertifikat auszustellen und zu verwenden, ist es wichtig, außerdem Folgendes zu verifizieren:
Pivit ermöglicht es, verschiedene Attribute in der CSR über Umgebungsvariablen zu setzen.
Die folgenden Zertifikatsoptionen werden wie folgt gesetzt:
Subject.CommonName wird auf den Wert der Umgebungsvariable PIVIT_EMAIL gesetzt.Subject.Organization wird auf den Wert der Umgebungsvariable PIVIT_ORG gesetzt.Subject.OrganizationalUnit wird auf den Wert der Umgebungsvariable PIVIT_ORG_UNIT gesetzt.Zusätzlich werden die folgenden Subject Alternative Names (SANs) in die Zertifikatsanfrage aufgenommen:
PIVIT_EMAILPIVIT_CERT_URIS angegeben sind (URIs werden durch ein Leerzeichen getrennt)Das PIV-Modul unterstützt mehrere Slots, in denen Schlüssel und Zertifikate gespeichert werden können.
Verfügbare Slots - 9a, 9c, 9d und 9e.
9e ist der „Card Authentication“-Slot.9a ist der „Authentication“-Slot. Wird für Aktionen wie die Systemanmeldung verwendet.9c ist der „Digital Signature“-Slot. Wird für Dokumentsignaturen oder zum Signieren von Dateien und ausführbaren Dateien verwendet.9d ist der „Key Management“-Slot. Wird für Dinge wie das Verschlüsseln von E-Mails oder Dateien zur Gewährleistung der Vertraulichkeit verwendet.Weitere Informationen
pivit ermöglicht die Auswahl eines Slots über das Flag -w.
Für jeden Befehl wird, wenn kein Slot angegeben ist, standardmäßig 9e verwendet.
Zum Beispiel:
Zertifikatserzeugung
pivit --generate [-w slot]
Signieren
pivit -s -u userid [-w slot]
Zertifikat ausgeben
pivit --print [-w slot]
Standardmäßig erwartet pivit, dass genau ein Yubikey angeschlossen ist. Wenn ein System über mehrere Kartenleser oder Yubikeys verfügt, oder
um einfach sicherzustellen, dass pivit mit dem gewünschten Yubikey kommuniziert, geben Sie die Seriennummer über die Umgebungsvariable PIVIT_YK_SERIAL
an.
Beispiel:
PIVIT_YK_SERIAL=13078292 pivit --print
Dies kann mit jedem Befehl verwendet werden.
pivit --import [--first-pem] [file]
Importiert ein Zertifikat aus file.
Der angegebene Dateiname soll ein serialisiertes x509-Zertifikat enthalten, das als PEM-Block kodiert ist.
Diese Aktion fragt nach der Yubikey-PIN.
Fügen Sie --first-pem hinzu, um den ersten PEM-Block aus file zu importieren und den Rest zu ignorieren. Dies ist hilfreich, wenn Sie eine CA verwenden, die
ihre ausgestellten Zertifikate als Kette oder Bündel bereitstellt, wobei das Endentitätszertifikat zuerst kommt (dies ist die Konvention).
pivit --print
Gibt das im Card-Authentication-Slot des Yubikey gespeicherte Zertifikat zusammen mit seinem Fingerabdruck aus.
Zum Beispiel:
> pivit --print
bad126c47dc90e90e0c7ec90ec682b1717e52757
-----BEGIN CERTIFICATE-----
MIICczCCAVugAwIBAgIRANATKTxzlHOJgMdV30XRz5kwDQYJKoZIhvcNAQELBQAw
ITEfMB0GA1UEAwwWWXViaWNvIFBJViBBdHRlc3RhdGlvbjAgFw0xNjAzMTQwMDAw
MDBaGA8yMDUyMDQxNzAwMDAwMFowJTEjMCEGA1UEAwwaWXViaUtleSBQSVYgQXR0
ZXN0YXRpb24gOWUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAT1l76Mvo6dJ4CwX2QQ
HImYRWbxLqt1kCVsn0PUn20DYtSKLuq8kCnMAn+kdneqjtaaBmWuPJH+g7LMyI18
QDQp2w+qSOf9ZWrOupMAGM8EpWXNTSNKoE50JhKXFbudBByjTjBMMBEGCisGAQQB
gsQKAwMEAwUBAjAUBgorBgEEAYLECgMHBAYCBACDq1IwEAYKKwYBBAGCxAoDCAQC
AQIwDwYKKwYBBAGCxAoDCQQBBDANBgkqhkiG9w0BAQsFAAOCAQEAGSmu0PUMDfEb
PkmkJ/rKYvpOKhbmpryjXuZ7ENJ3jGq3foyLSN+aBbd3M1im2ejC6/upthcp1N5M
Mg2SN6MBRS4crtt43DVHepBPt2W07vW8h4uFosJX29HdhK0dP+RnBGDdWYo0nq7y
7q1Y1c0BI7oGnaORL0DzSDtdxAJAphjspWsWNCIP2DTWQPhLTg4DqmYd/ahygVsZ
IE64QvJDQC72Dfyad6tIajmtPncqPt857H0hEJv2X58iOoJA/wAeuId4or859cJU
GTDbN7Ke4LWXRbs7StJTgefmNgWmKjm1Q2qs80WGShyQ6OrxALejd8jivtcTwsDz
WvzdmHCOmg==
-----END CERTIFICATE-----
Der Fingerabdruck des Zertifikats wird berechnet, indem eine SHA1-Prüfsumme über die rohen Zertifikatsbytes gebildet und die Prüfsumme anschließend als Hex-String kodiert wird.
Verwenden Sie den Fingerabdruck des Zertifikats, um git mitzuteilen, welches Zertifikat beim Signieren von Commits und Tags verwendet werden soll:
FINGERPRINT=`pivit --print | head -1`
git config --(local|global) user.signingkey $FINGERPRINT
pivit -s [-a] [-b] [-u userid] [--status-fd=[num]] [-t url] [file]
-a (--armor) - ob die Signatur in ASCII-Armor verpackt wird, um sie druckbar zu machen.-b (--detach-sign) - erstellt eine separate Signatur.-u (--local-user) - entweder eine E-Mail-Adresse oder ein als Hex-String kodierter Schlüsselfingerabdruck.--status-fd - Dateideskriptor, an den Statusmeldungen ausgegeben werden. 1 ist stdout, 2 ist stderr.0 oder kleiner bedeutet, dass keine Statusmeldungen geschrieben werden.-t (--timestamp-authority) - URL einer RFC3161-Zeitstempelbehörde, die für die Zeitstempelerstellung verwendet wird.Dieser Befehl lässt den Yubikey blinken und blockiert, bis er berührt wird.
Wenn git zum Signieren von Commits und Tags eingerichtet ist, verwendet es die folgenden fest codierten Parameter -sbau [user.signingkey] --status-fd=1.
user.signingkey wird aus der lokalen/globalen Konfiguration von git übernommen.
Hinweis: Pivit wurde entwickelt, um das Signieren von Git-Commits zu unterstützen.
Wenn der verwendete Schlüssel jedoch mit--pin-policy=alwayserstellt wurde, wird dies möglicherweise nicht vollständig unterstützt.
Derzeit fragt Pivit die PIN nur über die Befehlszeile ab. Wenn Sie GUI-basierte Git-Clients wie GitKraken oder SourceTree verwenden, werden Sie diese Abfrage wahrscheinlich verpassen.
pivit --verify [file ...]
Verifiziert die signierten Daten, die in den Dateiargument(en) angegeben sind.
Wenn keine Dateien angegeben wurden, wird von stdin gelesen.
Wenn ein oder kein Dateipfad angegeben wurde, wird angenommen, dass die Signatur an den signierten Daten angehängt ist.
Andernfalls wird angenommen, dass die erste Datei die Signatur und die zweite die signierten Daten enthält.
Geben Sie - an, um zu kennzeichnen, dass die signierten Daten von stdin gelesen werden sollen.
file - Pfad zu der Datei, die signiert wird. Wenn kein Dateiname angegeben ist, wird stdin verwendet.