Como habilitar a assinatura automática de commits do Git com GnuPG (GPG) no Windows
Published: 2023-04-02 13:45:53

_Este é um guia para habilitar `git commits` com assinatura `GPG` no GitHub._

> _"O GnuPG é um programa de software de criptografia híbrida porque usa uma combinação de criptografia de chave simétrica convencional por questões de velocidade e criptografia de chave pública para facilitar a troca segura de chaves, geralmente usando a chave pública do destinatário para criptografar uma chave de sessão que é usada apenas uma vez. Este modo de operação faz parte do padrão OpenPGP e faz parte do PGP desde sua primeira versão."_
>
> [Wikipédia](https://pt.wikipedia.org/wiki/GNU_Privacy_Guard)

* * *

### 1) Instale `Gpg4win`

Gpg4win pode ser baixado em [www.gpg4win.org](www.gpg4win.org){:target="_blank"}

O `Gpg4win` é um pacote do `GnuPG v2`, que contem:
  - `Kleopatra`, que é um gerenciador de certificados;
  - `GNU Privacy Assitant (GPA)`, que é uma `GUI` que usa `GTK + GpgOL` e `GpgEX`, que são respectivamente uma extensão para `Outlook` e `Windows Shell`.

> Como o foco deste tutorial não é demonstrar a utilização no Outlook, não iremos instalar o `GpgOL`, portanto, na janela de _"Escolha de Componentes"_, deixe conforme a imagem abaixo:

![image](https://user-images.githubusercontent.com/4163340/132080151-42e78738-ce4f-4502-a2a0-0700cd8ace2d.png)

Aperte o botão `seguinte` e depois selecione o diretório onde os arquivos do programa `Gp4win` ficarão (_você irá precisar desta informação mais pra frente_), feito isto clique em `instalar`.

* * *

### 2) Crie uma nova `key pair`
Após a instalação do `Gp4win`, abra o programa `Kleopatra`:
Na janela inicial vá ao menu `File > New Key Pair...`, abrirá uma nova janela, nela clique no botão `Create a personal OpenPGP key pair`.

![image](https://user-images.githubusercontent.com/4163340/132080282-f9d32a95-b621-4417-be86-bea8f82706e6.png)

Uma nova janela solicitando algumas informações será aberta, agora basta preencher os campos com os seus dados `Nome` e `Email` e marcar a caixa `Protect the generated key with a passphrase`.

![image](https://user-images.githubusercontent.com/4163340/132080360-2e1b6c0c-df8a-44f9-a063-0bcf010b3072.png)

Ainda na mesma janela clique em `Advanced Settings...`, na nova janela que abrir, selecione `RSA`, marque `+ RSA-`, e altere os valores dos selects para `4,096 bits`.

No campo `Valid until:` escolha uma data limite para a validade da chave que será criada, no exemplo deixei a data de `03/09/2023`.

![image](https://user-images.githubusercontent.com/4163340/132080388-22ecd5c0-b0dc-42ff-b1aa-45b259a55b4f.png)

Clique em `Ok` e depois em `Create`, feito este procedimento abrirá uma nova janela para que você digite uma senha:

![image](https://user-images.githubusercontent.com/4163340/132080409-0645f276-b30b-436b-abd7-2f3fc76271fa.png)

> _A senha deve ter no mínimo `08 (oito) dígitos`_

Após digitar a senha clique em `OK` e aguarde até que o sistema gere sua `Key Pair`.

Realizado o procedimento anterior e dando tudo certo, abrirá uma nova janela com a mensagem "_Key Pair Succesfully Created_" contendo algumas informações sobre a nova chave criada, conforme a imagem abaixo:

![image](https://user-images.githubusercontent.com/4163340/132080453-87940d9d-6a58-4d72-b1b5-b3d7caec2874.png)

Gerada a `Kei Pair`, clique em `Finish`.

* * *

### 3) Copiando a chave GPG criada

Se tudo deu certo até aqui você perceberá que na janela principal do `Kleopatra` vai estar aparecendo as informações básicas da sua nova chave, algo parecido com a imagem abaixo:

![image](https://user-images.githubusercontent.com/4163340/132080477-c84f09be-3b6a-4f66-9a48-5f03c4fe7800.png)

Clique duas vezes na linha que possui a nova chave gerada para abrir a janela `Export`, que permitirá que exportemos a chave criada. Com a janela `Export` aberta, clique em `Export...`. Abrirá uma nova janela `Export - Kleopatra`, selecione todo o texto e copie `Ctrl+C`.

![image](https://user-images.githubusercontent.com/4163340/132080620-e74494d8-1218-4a9f-ad56-8a41e425cac5.png)

Após copiar, clique em `close` e depois em `close` novamente.

* * *

### 4) Inserindo a chave GPG no Github

De posse da chave copiada no "item 3" deste tutorial, vá ao `GitHub` e navegue pelo menu em `Settings > SHH and GPG keys` e na janela que abrir procure pelo botão `New GPG Key`

![image](https://user-images.githubusercontent.com/4163340/132080663-aa5219a0-de71-4e85-a08d-bc29a53d152d.png)

Clicando em `New GPG Key`, abrirá uma nova janela com o campo `GPG keys/ Add new`, neste campo cole todo o texto que você copiou no "item 3" deste tutorial, deixando mais ou menos assim:

![image](https://user-images.githubusercontent.com/4163340/132080694-b9c250d8-3d55-4c4a-b3f7-fcc4d1f26037.png)

Colado o texto, cliquem em `Add GPG Key`. Você será redirecionado para a página `SSH and GPG keys`, que agora conterá as informações básicas da sua nova chave GPG criada, como na imagem abaixo:

![image](https://user-images.githubusercontent.com/4163340/132080800-1cc893f3-8bef-4838-b3d5-ade59c82ea91.png)

> 💡**Atenção**
>
> _Na imagem acima aparace a mensagem `Unverified` ao lado do e-mail inserido. Isto é um alerta indicando que o e-mail não está  vinculado à sua conta do GitHub, portanto, se você inserir o e-mail correto vinculado à sua conta, a mensagem de não aparecerá_

* * *

### 5) Configurando o Git para realizar commits verificados

Abra o terminal e digite o comando:
```shell
git config --global commit.gpgsign true
```

Volte na página `SSH an GPG keys` do `GitHub` e copie o valor de `Key ID`, o que está em azul na imagem abaixo:
> _O valor da sua Key ID será diferente do da imagem_

![image](https://user-images.githubusercontent.com/4163340/132080953-e1f97f0a-a55a-4e3a-b621-b1c2235f1bff.png)

Copiado o valor, volte ao terminal e digite o seguinte comando:

```shell
git config --global user.signingkey MEU_KEY_ID
```

_Substitua MEU_KEY_ID pelo valor copiado na página "SSH an GPG keys"_

Feito, agora digite o comando:

```shell
git config --global gpg.program 'Disco:/caminho/do/GnuPG/bin/gpg.exe`
```
#### 🏷️**Exemplo:**
```shell
git config --global gpg.program 'C:/programs/GnuPG/bin/gpg.exe`
``` 

> 💡 **Atenção**
> _Use o caminho completo utilizando `/` e não `\`_


* * *

### 6) Testando o comando
Se deu tudo certo a partir de agora você será capaz de realizar commits verificados para sua conta no GitHub, para isso, faça um commit utilizando a flag `-S`, assim:

```shell
git commit -S -m 'Commit verificado'
```

Ao clicar em `enter` abrirá uma nova janela solicitando a senha que foi criada no momento da geração da chave no `Kleopatra`. Digite a senha correta e tecle `enter`, que o commit será realizado.

Para finalizar, depois do commit, dê um `push` e seja feliz 😁

```shell
git push
```

Seus commits aparecerão no histórico com uma tag `verified` ao lado, conforme a imagem abaixo:

![image](https://user-images.githubusercontent.com/4163340/132081292-26b2c7b6-82f0-4a63-a311-9446bc888a98.png)

*** 

### 7) Habilitando no WSL2

Para habilitar a assinatura automática de commits do Git com GnuPG (GPG) no Windows Subsystem for Linux (WSL), siga os passos abaixo:

- 7.1 - Instale o GnuPG no WSL: Abra um terminal do WSL e execute o seguinte comando para instalar o GnuPG:

```
sudo apt update
sudo apt install gnupg
```

Isso irá instalar o GnuPG no seu ambiente WSL.

- 7.2 - Gere suas chaves GPG: Para assinar commits automaticamente, você precisa ter uma chave GPG. Se você já possui uma chave GPG, você pode pular esta etapa. Caso contrário, você pode gerar uma nova chave GPG usando o seguinte comando:
```bash
gpg --gen-key
```

> Siga as instruções do GnuPG para gerar uma nova chave GPG. Você precisará definir uma senha para sua chave GPG durante o processo.

- 7.3 - Configure o Git para usar a chave GPG: Após gerar sua chave GPG, você precisa configurar o Git para usá-la. Para fazer isso, execute os seguintes comandos no terminal do WSL:
```bash
git config --global user.signingkey <sua_chave_gpg>
git config --global commit.gpgsign true
git config --global gpg.program gpg
```
> Substitua `<sua_chave_gpg>` pelo ID da chave GPG que você gerou na etapa anterior.

- 7.4 - Exporte sua chave GPG pública: No terminal do WSL, você pode exportar sua chave GPG pública usando o seguinte comando:
```bash
gpg --armor --export <seu_ID_de_chave> > chave_gpg_publica.asc
```

- 7.5 - Substitua `<seu_ID_de_chave>` pelo ID da sua chave GPG que você deseja adicionar ao GitHub. Isso irá criar um arquivo com extensão ".asc" que contém a sua chave GPG pública.

- 7.6 - Importe sua chave GPG no WSL: Você também precisa importar sua chave GPG no WSL para que o Git possa encontrar e usar sua chave para assinar os commits automaticamente. Para importar a chave, você pode usar o seguinte comando:
```bash
gpg --import <caminho_para_sua_chave_gpg>
```

> Exemplo
> gpg --import chave_gpg_publica.asc

- 7.7 - Substitua `<caminho_para_sua_chave_gpg>` pelo caminho completo para o arquivo da chave GPG que você exportou ou recebeu de outra fonte.

- 7.8 - Configure sua variável de ambiente GPG_TTY: Para que a assinatura automática de commits funcione corretamente no WSL, você precisa configurar a variável de ambiente GPG_TTY. Você pode fazer isso adicionando o seguinte comando ao seu arquivo de perfil do shell (por exemplo, ~/.bashrc ou ~/.zshrc):
```bash
export GPG_TTY=$(tty)
```
Isso permitirá que o GnuPG encontre o terminal correto para exibir os prompts de senha quando necessário.


### Adicionando a chave do WSL ao Github
Para adicionar sua chave GPG ao GitHub, você pode seguir os passos abaixo:
Copie o conteúdo do arquivo de chave pública: Abra o arquivo de chave pública gerado (chave_gpg_publica.asc) em um editor de texto ou em um visualizador de arquivos e copie todo o conteúdo do arquivo.
Copiada a chave siga o procedimento listado no passo `4) Inserindo a chave GPG no Github` deste tutorial.