Índice

Um recurso relativamente desconhecido e subutilizado do Git é a capacidade de assinar criptograficamente commits. É uma feature opcional que fornece uma maneira para o autor de um commit provar propriedade.

Ele usa a chave GPG do autor para deixar uma assinatura no commit que pode ser verificada mais tarde. Se você é um usuário do Keybase , é muito fácil usar a chave GPG do Keybase para assinar suas confirmações do Git.

Depois que você assinar seus commits, o GitHub fornece uma boa interface para verificar se os commits foram assinados e por quem.

Por que assinar commits?

O Git aceitará qualquer nome e endereço de e-mail como autor de commit e o GitHub também. Portanto, se você definir o autor no commit como um endereço de email válido, parecerá que ele fez o commit. Isso se deve à natureza distribuída do Git, que permite a qualquer pessoa dar push nos commits de outras pessoas. No entanto, do ponto de vista da segurança, isso é um problema.

Infelizmente, não há como impedir que alguém não consiga fazer um commit com seu nome e email. No entanto, o Git suporta commits assinados criptográficamente usando uma chave GPG. Isso permite que o GitHub marque seus commits como Verificados quando ele pode corresponder com seu email verificado à sua chave GPG. Isso não impedirá que alguém tente falsificar seus commits, mas garantirá suas confirmações reais para que os mesmos possam ser verificadas corretamente.

Keybase e GPG

Instalando Keybase

Ubuntu

64-bit
curl --remote-name https://prerelease.keybase.io/keybase_amd64.deb
sudo apt install ./keybase_amd64.deb
run_keybase
32-bit
curl --remote-name https://prerelease.keybase.io/keybase_i386.deb
sudo apt install ./keybase_i386.deb
run_keybase -g # run without GUI; it is not supported on 32-bit Linux

Mac

Instale o Keybase.dmg disponibilizado aqui

Instalando GPG

Ubuntu

apt gnupg

Mac

brew install gnupg

GitHub e Keybase

A partir daqui eu assumo que você criou uma conta no Github e no Keybase.

O GitHub fornece uma página de configurações para definir sua chave GPG; no entanto, se você enviar sua chave GPG bruta do Keybase, provavelmente ela conterá uma referência de usuário do Keybase: username@keybase.io.

Este não é um endereço de e-mail ativo e, portanto, o GitHub não poderá verificar. Também não corresponde ao endereço de e-mail nos seus commits. Então, precisamos fazer mais algumas coisas para que tudo funcione.

Atualizando a chave PGP (do Keybase)

Primeiro, exporte suas chaves públicas e privadas do Keybase usando o comando:

keybase pgp export > keybase-public.key
keybase pgp export --secret > keybase-private.key

Durante o processo de exportação, o Keybase solicitará a senha da sua conta e solicitará que defina uma nova senha para o arquivo de chave privada.

No próximo passo, você precisa importar as chaves para o GPG:

gpg --allow-secret-key-import --import keybase-private.key
gpg --import keybase-public.key

O processo de importação solicitará a senha que você acabou de atribuir à sua chave privada.

Adicionando novos usuários

Agora que você importou a chave para o GPG, é necessário modificar a chave para incluir seu e-mail pessoal ou o e-mail da empresa. Se você não configurou nada, provavelmente seu idenficiador é <username>@keybase.io, caso contrário, é o e-mail qeu você definiu no Keybase.

gpg --edit-key <username>@keybase.io

Este comando o abre o gpg> e, a partir daí, você precisará executar o comando adduid. Ele solicitará seu nome real (Real name) e endereço de email (Email address), fique à vontade para deixar o comentário (Comment) em branco.

gpg> adduid
Real name: <your name>
Email address: <your email>
Comment:
You selected this USER-ID:
    "<your name> <your email>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit?

Depois de fornecer seu nome e email, confirme usando O e save para fechar o gpg>.

Feito isso, você pode enviar sua chave atualizada de volta ao Keybase.

keybase pgp update

Confiando na sua chave GPG

Nesse momento, sua chave não é confiável pelo GPG e está marcada como desconhecida (unknown).

Se você está seguindo esse tutorial justamente para assinar commits do git, é importante que, ao auditar assinaturas (por exemplo, com git log --show-signatures), você não veja suas assinaturas marcadas como não confiáveis (untrustworthy).

Isso pode ser feito abrindo o gpg> novamente usando gpg --edit-key <chave> e selecionando a opção trust. Sugiro usar o nível de confiança 5 = I trust ultimately, pois é sua própria chave. Após aplicar a alteração, use save para fechar.

Adicionando a chave no Github

Essa é a parte mais fácil, vá até seu perfil do Keybase (https://keybase.io/<username>) e clique na chave pública na lista de identidades.

Vá em Settings > SSH and GPG keys no GHithub e adicione com o New GPG Key.

Assinando os commits do Git

Finalmente, a última coisa necessária é informar o comando git para assinar os commits com a sua chave.

Use a opção git config user.signingkey para especificar o ID da chave para o git usar. Você pode obter isso na página de chaves GPG do GitHub onde você a adicionou, se não tiver certeza de qual é o ID.

Você também pode exigir que o Git assine todos os commits com a opção commit.gpgsign:

git config --global user.signingkey <ID da Chave>
git config --global commit.gpgsign true

Commits Verificados

Commits
Commits assinados com o verified do Github

Qualquer commit futuro desse sistema/usuário será verificado, provando que você é o autor. A assinatura de commits git não inibirá a falsificação, mas fornecerá garantia de commits reais para que possam ser verificados corretamente.