
Gerencie certificados x509 em YubiKeys habilitadas para PIV, gere chaves e solicitações de certificado, e assine ou verifique commits e arquivos git.
O Pivit é uma ferramenta de linha de comando para gerenciar certificados x509 armazenados em smart cards com suporte ao applet PIV (Yubikey), e usar esses certificados para assinar e verificar dados.
Ele é totalmente compatível com a forma como a linha de comando do git chama programas externos para assinar e verificar commits e tags.
brew install pivit
go install github.com/cashapp/pivit/cmd/pivit@latest
Para configurar o git para usar o pivit para assinar e verificar assinaturas, execute os seguintes comandos:
git config --(local|global) gpg.format x509
git config --(local|global) gpg.x509.program pivit
pivit --reset
Redefine o applet PIV do Yubikey e cria um novo PIN para acessá-lo.
pivit --generate [--p256] [--self-sign | --no-csr] [--assume-yes] [--pin-policy] [--touch-policy]
Gera um novo par de chaves no slot de autenticação de cartão do Yubikey.
Este comando também irá gerar e armazenar um certificado x509 para a chave gerada, assinado pela Yubico.
Se a opção --p256 for fornecida, o par de chaves é gerado usando a curva elíptica P-256.
Caso contrário, a curva P-384 é usada.
Adicione a opção --self-sign para gerar um certificado autoassinado;
o certificado é assinado com a chave recém-gerada.
Você será solicitado a confirmar se realmente deseja um certificado autoassinado,
depois será solicitado o PIN e, em seguida, será solicitado a tocar no seu Yubikey.
A saída conterá 3 blocos CERTIFICATE em vez de um CERTIFICATE_REQUEST no final (exemplo de saída abaixo).
Esta opção é útil principalmente para fins de teste.
A opção --assume-yes pode ser usada em combinação com a opção --self-sign para desativar a confirmação s/n.
Adicione a opção --no-csr para evitar que a solicitação de assinatura de certificado seja impressa. Nesse caso, você não será solicitado a tocar no seu Yubikey.
Esta opção é útil se você não precisar que a chave gerada faça parte de uma PKI existente.
Você ainda pode verificar o certificado da chave usando o certificado da Yubico aqui.
A opção --pin-policy controla quando solicitar um PIN ao acessar a chave gerada.
Defina como um dos valores never, once ou always (o padrão é never).
A opção --touch-policy controla quando solicitar o toque físico no hardware ao acessar a chave gerada.
Defina como um dos valores never, cached ou always (o padrão é always).
A saída do comando terá a seguinte aparência:
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-----
O CERTIFICATE REQUEST no final é assinado pela nova chave privada gerada,
e pode ser usado para emitir um certificado assinado por uma CA.
Se você optar por emitir e usar seu próprio certificado, é importante também verificar que:
O Pivit permite definir diferentes atributos no CSR por meio de variáveis de ambiente.
As seguintes opções de certificado serão definidas da seguinte forma:
Subject.CommonName será definido com o valor da variável de ambiente PIVIT_EMAIL.Subject.Organization será definido com o valor da variável de ambiente PIVIT_ORG.Subject.OrganizationalUnit será definido com o valor da variável de ambiente PIVIT_ORG_UNIT.Além disso, os seguintes Nomes Alternativos do Sujeito (SANs) serão incluídos na solicitação de certificado:
PIVIT_EMAILPIVIT_CERT_URIS (as URIs são separadas por um espaço)O módulo PIV suporta vários slots onde chaves e certificados podem ser armazenados.
Slots disponíveis - 9a, 9c, 9d e 9e.
9e é o slot de "Autenticação de Cartão".9a é o slot de "Autenticação". Usado para ações como login no sistema.9c é o slot de "Assinatura Digital". Usado para assinatura de documentos, ou assinatura de arquivos e executáveis.9d é o slot de "Gerenciamento de Chaves". Usado para coisas como criptografar e-mails ou arquivos com o objetivo de confidencialidade.Para mais informações
O pivit permite escolher um slot usando a opção -w.
Para cada comando, se nenhum slot for especificado, 9e é usado por padrão.
Por exemplo:
Geração de certificado
pivit --generate [-w slot]
Assinatura
pivit -s -u userid [-w slot]
Impressão de um certificado
pivit --print [-w slot]
Por padrão, o pivit espera que um único Yubikey esteja conectado. Se um sistema tiver vários leitores de cartão ou Yubikeys, ou
simplesmente para garantir que o pivit esteja falando com o Yubikey pretendido, especifique o número de série por meio da variável
de ambiente PIVIT_YK_SERIAL.
Exemplo:
PIVIT_YK_SERIAL=13078292 pivit --print
Isso pode ser usado com qualquer comando.
pivit --import [--first-pem] [file]
Importa um certificado de file.
Espera-se que o nome de arquivo fornecido contenha um certificado x509 serializado codificado como um bloco PEM.
Esta ação solicita o PIN do Yubikey.
Adicione --first-pem para importar o primeiro bloco PEM de file, ignorando o restante. Isso é útil se você estiver usando uma CA que
fornece seus certificados emitidos como uma cadeia ou pacote, com o certificado da entidade final primeiro (esta é a convenção).
pivit --print
Imprime o certificado armazenado no slot de autenticação de cartão do Yubikey, juntamente com sua impressão digital.
Por exemplo:
> 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-----
A impressão digital do certificado é calculada executando uma soma de verificação SHA1 nos bytes brutos do certificado e codificando a soma de verificação como uma string hexadecimal.