# Assinatura de Commits com Chave GPG

Para começar esse assunto vou começar como sempre gosto de fazer, com conceitos.

# **O que é uma Chave GPG?**

Em resumo GPG (Gnu Privacy Guard), também conhecido como GnuPG é uma ferramenta de criptografia assimétrica, que usa um par de chaves, sendo uma pública e uma privada que são usadas para identificação do indivíduo.

Ele permite, por exemplo que qualquer pessoa que leia um email assinado possa verificar a autenticidade, garantido que o emissor é realmente quem está enviando.

O Objetivo é evitar que um terceiro possa interceptar e/ou modificar o conteúdo de uma mensagem.

# **Por que eu devo assinar meus commits?**

Assim como as mensagens em e-mails os commits também podem ser assinados e recomenda-se fazer isso para validar que o código foi realmente feito por você.

Por exemplo, ao usar os comandos do git para enviar determinada informação à um repositório você consegue alterar o dono da informação.

```bash
git config — global user.email “fulano@gmail.com”
git config - -global user.name “Fulano da Silva”
```

Ao enviar, o commit vai nomeado com essas informações que podem mudar sempre que você preferir.

Quando você abre o commit ele está como unverified.

![](https://miro.medium.com/v2/resize:fit:471/1*uYupHJbyvNdXqF0I6T1b7w.png align="left")

Fonte: GitHub

# **Gerando a Chave GPG**

Certo, agora que temos o conceito é o motivo de usarmos, vamos a parte divertida, criar a nossa chave.

Nota: caso ainda não tenha instalado, o faça com o seguinte comando:

```bash
sudo apt update && sudo apt install gpg -y
```

Depois de instalado o pacote vamos executá-lo para criar a nossa chave:

```bash
gpg --full-generate-key
```

Deve aparecer um menu com algumas opções de tipos de chave, como vamos gerar para github, vamos seguir toda a recomendação deles. Então nesse caso vamos escolher a **RSA e RSA (padrão)** na opção **1.**

```plaintext
Por favor selecione o tipo de chave desejado:
 (1) RSA e RSA (padrão)
 (2) DSA e Elgamal
 (3) DSA (apenas assinatura)
 (4) RSA (apenas assinar)
 (14) Existing key from card
Sua opção? 1
```

No próximo questionamento vamos escolher o tempo que vai durar a chave. indica-se o tempo que você estará no projeto ou algum de acordo com sua necessidade ou da sua empresa, no nosso caso vamos deixar sem expirar. Então vamos de opção **0.**

```plaintext
RSA chaves podem ter o seu comprimento entre 1024 e 4096 bits.
Que tamanho de chave você quer? (3072) 4096
O tamanho de chave pedido é 4096 bits
Por favor especifique por quanto tempo a chave deve ser válida.
         0 = chave não expira
      <n>  = chave expira em n dias
      <n>w = chave expira em n semanas
      <n>m = chave expira em n meses
      <n>y = chave expira em n anos
A chave é valida por? (0)
```

Vai surgir uma pergunta de reafirmação, para saber se é isso mesmo que você quer e escolha **S.**

```plaintext
A chave não expira nunca
Está correto (s/N)? s
```

Na próxima etapa você deve preencher com seus dados e afirmar com **O** caso esteja tudo certo.

```plaintext
GnuPG precisa construir uma ID de usuário para identificar sua chave.Nome completo: Nil********ra
Endereço de correio eletrônico: nil*********ra@gmail.com
Comentário: 
Você selecionou este identificador de usuário:
 “Nil************ra <nil***********ra@gmail.com>”Muda (N)ome, ©omentário, (E)ndereço ou (O)k/(S)air? O
```

Pronto, sua chave será gerada e surgirá um texto com o ID da mesma, esse será usado mais a frente, então, guarde-o.

```plaintext
gpg: /home/nilson/.gnupg/trustdb.gpg: banco de dados de confiabilidade criado
gpg: chave ID_DA_CHAVE marcada como plenamente confiável
gpg: directory '/home/nilson/.gnupg/openpgp-revocs.d' created
gpg: revocation certificate stored as '/home/nilson/.gnupg/openpgp-revocs.d/A1B2C3D4E5F6G7H8I9J0A1B2C3D4E5F6G7H8I9J0.rev'chaves pública e privada criadas e assinadas.pub   rsa4096 2022-03-18 [SC]
      A1B2C3D4E5F6G7H8I9J0A1B2C3D4E5F6G7H8I9J0
uid                      Nilson R S Vieira <nil***********ra@gmail.com>
sub   rsa4096 2022-03-18 [E]
```

Caso tenha perdido, pode buscar novamente com comando:

```bash
gpg --list-secret-keys --keyid-format=long
```

Com o ID da chave em mãos vamos verificar o conteúdo da chave pública, pois usaremos este conteúdo para adicionar ao Github.

```bash
gpg --armor --export ID_DA_CHAVE
```

Deve aparece um conteúdo inciando e terminando assim

```plaintext
-----BEGIN PGP PUBLIC KEY BLOCK-----
<INFORMAÇÃO OCULTADA>
-----END PGP PUBLIC KEY BLOCK-----
```

Copie todo o conteúdo e vamos ao github.

No canto superior direito de qualquer página, clique na sua foto de perfil e, em seguida, clique em Configurações.

![](https://miro.medium.com/v2/resize:fit:412/0*WVCJACpzhiWd4-ao.png align="left")

Fonte: GitHub

Na Seção “**Access**” na barra lateral, clique em **SSH and GPG keys**.

Clique em **New GPG key** (Nova chave GPG).

![](https://miro.medium.com/v2/resize:fit:700/0*qJZFMErBgkhnexBf.png align="left")

Fonte: GitHub

No campo “Key” (Chave), cole a chave GPG que você copiou.

![](https://miro.medium.com/v2/resize:fit:700/0*bGO5ToiHV2ArQ05q.png align="left")

Fonte: GitHub

Clique em Add GPG key (Adicionar chave GPG).

![](https://miro.medium.com/v2/resize:fit:157/0*4uiAbfb4p77yzybY.png align="left")

Fonte: GitHub

Para confirmar a ação, insira sua senha do GitHub.

Pronto! Agora só precisamos assinar nossos commits

# **Assinando Commits**

Para assinar os commits precisamos apenas fazer os passos que já conhecemos, com a mesma sequência, como adicionar os arquivos/modificações, “comitar” e enviar.

```bash
git add . 
git commit -S -m "Comentário de Commit Assinado"
git push -o origin BRANCH
```

Feito isso ao olhar no Github você verá que seu commit está verificado como se fosse criado dentro da própria plataforma.

![](https://miro.medium.com/v2/resize:fit:322/1*l1ixFcbOcO3P1OpSSgbh1A.png align="left")

Fonte: GitHub

# **Referências**

[https://docs.github.com/pt/authentication/managing-commit-signature-verification/generating-a-new-gpg-key](https://docs.github.com/pt/authentication/managing-commit-signature-verification/generating-a-new-gpg-key)

[https://docs.github.com/pt/authentication/managing-commit-signature-verification/adding-a-new-gpg-key-to-your-github-account](https://docs.github.com/pt/authentication/managing-commit-signature-verification/adding-a-new-gpg-key-to-your-github-account)

[https://docs.github.com/pt/authentication/managing-commit-signature-verification/signing-commits](https://docs.github.com/pt/authentication/managing-commit-signature-verification/signing-commits)

[https://access.redhat.com/documentation/pt-br/red\_hat\_enterprise\_linux/6/html/security\_guide/sect-security\_guide-encryption-using\_gpg-creating\_gpg\_keys\_in\_kde](https://access.redhat.com/documentation/pt-br/red_hat_enterprise_linux/6/html/security_guide/sect-security_guide-encryption-using_gpg-creating_gpg_keys_in_kde)
