
Gestionar certificados x509 en YubiKeys habilitadas para PIV, generar claves y solicitudes de certificados, y firmar o verificar commits de git y archivos.
Pivit es una herramienta de línea de comandos para gestionar certificados x509 almacenados en tarjetas inteligentes con soporte de applet PIV (Yubikey), y usar esos certificados para firmar y verificar datos.
Es totalmente compatible con la forma en que la línea de comandos de git llama a programas externos para firmar y verificar commits y etiquetas.
brew install pivit
go install github.com/cashapp/pivit/cmd/pivit@latest
Para configurar git para que use pivit para firmar y verificar firmas, ejecuta los siguientes comandos:
git config --(local|global) gpg.format x509
git config --(local|global) gpg.x509.program pivit
pivit --reset
Reinicia el applet PIV del Yubikey y crea un nuevo PIN para acceder a él.
pivit --generate [--p256] [--self-sign | --no-csr] [--assume-yes] [--pin-policy] [--touch-policy]
Genera un nuevo par de claves en la ranura de autenticación de tarjeta del Yubikey.
Este comando también generará y almacenará un certificado x509 para la clave generada, firmado por Yubico.
Si se proporciona la opción --p256, el par de claves se genera utilizando la curva elíptica P-256.
De lo contrario, se utiliza la curva P-384.
Añade la opción --self-sign para generar un certificado autofirmado;
el certificado se firma con la clave recién generada.
Se te pedirá que confirmes que realmente deseas un certificado autofirmado,
luego se te pedirá el PIN y, a continuación, se te pedirá que toques tu Yubikey.
La salida contendrá 3 bloques CERTIFICATE en lugar de un CERTIFICATE_REQUEST al final (ejemplo de salida abajo).
Esta opción es útil principalmente para fines de prueba.
La opción --assume-yes se puede usar en combinación con la opción --self-sign para deshabilitar la solicitud de sí/no.
Añade la opción --no-csr para omitir la impresión de la solicitud de firma de certificado. En este caso, no se te pedirá que toques tu Yubikey.
Esta opción es útil si no necesitas que la clave generada forme parte de una PKI existente.
Puedes verificar el certificado de la clave usando el certificado de Yubico aquí.
La opción --pin-policy controla cuándo se solicita el PIN al acceder a la clave generada.
Establézcala en uno de never, once o always (el valor predeterminado es never).
La opción --touch-policy controla cuándo se solicita tocar físicamente el hardware al acceder a la clave generada.
Establézcala en uno de never, cached o always (el valor predeterminado es always).
La salida del comando se verá así:
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-----
El CERTIFICATE REQUEST al final está firmado por la nueva clave privada generada,
y se puede usar para emitir un certificado firmado por una CA.
Si eliges emitir y usar tu propio certificado, también es importante verificar que:
Pivit permite establecer diferentes atributos en la CSR mediante variables de entorno.
Las siguientes opciones de certificado se establecerán de la siguiente manera:
Subject.CommonName se establecerá con el valor de la variable de entorno PIVIT_EMAIL.Subject.Organization se establecerá con el valor de la variable de entorno PIVIT_ORG.Subject.OrganizationalUnit se establecerá con el valor de la variable de entorno PIVIT_ORG_UNIT.Además, los siguientes Nombres Alternativos de Sujeto (SAN) se incluirán en la solicitud de certificado:
PIVIT_EMAILPIVIT_CERT_URIS (las URIs están separadas por un espacio)El módulo PIV soporta múltiples ranuras donde se pueden almacenar claves y certificados.
Ranuras disponibles: 9a, 9c, 9d y 9e.
9e es la ranura de "Autenticación de tarjeta".9a es la ranura de "Autenticación". Se usa para acciones como el inicio de sesión en el sistema.9c es la ranura de "Firma digital". Se usa para firmar documentos, o firmar archivos y ejecutables.9d es la ranura de "Gestión de claves". Se usa para cosas como cifrar correos electrónicos o archivos con fines de confidencialidad.Para más información
pivit permite elegir una ranura usando la opción -w.
Para cada comando, si no se especifica una ranura, se usa 9e por defecto.
Por ejemplo:
Generación de certificados
pivit --generate [-w slot]
Firma
pivit -s -u userid [-w slot]
Impresión de un certificado
pivit --print [-w slot]
Por defecto, pivit espera que haya un solo Yubikey conectado. Si un sistema tiene varios lectores de tarjetas o Yubikeys, o
para simplemente asegurarse de que pivit se está comunicando con el Yubikey deseado, especifique el número de serie mediante la variable de entorno PIVIT_YK_SERIAL.
Ejemplo:
PIVIT_YK_SERIAL=13078292 pivit --print
Esto se puede usar con cualquier comando.
pivit --import [--first-pem] [file]
Importa un certificado desde file.
Se espera que el nombre de archivo dado contenga un certificado x509 serializado codificado como un bloque PEM.
Esta acción solicita el PIN del Yubikey.
Añade --first-pem para importar el primer bloque PEM de file, ignorando el resto. Esto es útil si se usa una CA que
proporciona sus certificados emitidos como una cadena o paquete, con el certificado de entidad final primero (esta es la convención).
pivit --print
Imprime el certificado almacenado en la ranura de autenticación de tarjeta del Yubikey, junto con su huella digital.
Por ejemplo:
> 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-----
La huella digital del certificado se calcula realizando una suma de comprobación SHA1 sobre los bytes brutos del certificado y luego codificando la suma de comprobación como una cadena hexadecimal.
Usa la huella digital del certificado para que git sepa qué certificado usar al firmar commits y etiquetas:
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) - si se debe envolver la firma en armadura ASCII para hacerla imprimible.-b (--detach-sign) - hacer una firma separada.-u (--local-user) - ya sea una dirección de correo electrónico o una huella digital de clave codificada como cadena hexadecimal.--status-fd - descriptor de archivo al que emitir mensajes de estado. 1 es stdout, 2 es stderr.0 o inferior significa que no se escribirán mensajes de estado.-t (--timestamp-authority) - URL de una autoridad de sellado de tiempo RFC3161 para usar en el sellado de tiempo.Este comando hará que el Yubikey parpadee y bloqueará hasta que se toque.
Cuando git está configurado para firmar commits y etiquetas, usará los siguientes parámetros fijos -sbau [user.signingkey] --status-fd=1.
user.signingkey se toma de la configuración local/global de git.
Nota: Pivit fue diseñado para soportar la firma de commits de git.
Pero, si la clave que se usa fue creada con--pin-policy=always, puede que no sea totalmente compatible.
Ahora mismo, Pivit solicita el PIN solo a través de la línea de comandos. Si usas clientes git basados en GUI como GitKraken o SourceTree, probablemente te perderás ese aviso.
pivit --verify [file ...]
Verifica los datos firmados especificados en el/los argumento(s) de archivo.
Si no se especificaron archivos, lee desde stdin.
Si se especificó una o ninguna ruta de archivo, asume que la firma está adjunta a los datos firmados.
De lo contrario, asume que el primer archivo contiene la firma y el segundo contiene los datos firmados.
Especifica - para indicar que los datos firmados deben leerse desde stdin.
file - ruta al archivo que se firmará. Si no se especifica ningún nombre de archivo, usa stdin.