Skip to content

Instantly share code, notes, and snippets.

@alandvgarcia
Forked from troyfontaine/1-setup.md
Last active August 3, 2022 19:37
Show Gist options
  • Save alandvgarcia/9ae734bc66b489a19eae05cfa47d5194 to your computer and use it in GitHub Desktop.
Save alandvgarcia/9ae734bc66b489a19eae05cfa47d5194 to your computer and use it in GitHub Desktop.
Signing your Git Commits using GPG on MacOS

Methods of Signing with GPG on MacOS

Last updated June 23, 2022

There are now two ways to approach this:

  1. Using gpg and generating keys
  2. Using Kryptonite by krypt.co

This Gist explains how to do this using gpg in a step-by-step fashion. Kryptonite is actually wickedly easy to use-but you will still need to follow the instructions

For using a GUI-based GIT tool such as Tower or Github Desktop, follow the steps here for signing with either GPG or Krypt.co.

There has been a number of comments on this gist regarding some issues around the pinentry-program and M1 Macs. I've finally gotten a chance to try things out on an M1 and I've updated the documentation in 2-using-gpg.md to reflect my findings.

Usando GPG

Passo 1: Instalar software

Utilizamos o gestor de pacotes homebrew para este passo.

brew install gpg2 gnupg pinentry-mac       

Passo 2: Criar o Directório .gnupg

Se esta diretório não existir, crie-o. EDIT: Junho 2022 - Corrigindo citações simples para permitir a expansão da sub-capa

# Fazer o directório
mkdir ~/.gnupg

# Diz ao GPG qual o programa de pineração a utilizar
echo "pinentry-program $(brew --prefix)/bin/pinentry-mac" > ~/.gnupg/gpg-agent.conf

Passo 3: Atualizar ou Criar ~/.gnupg/gpg.conf

Se este ficheiro não existir, crie-o.

# Isto diz ao gpg para usar o gpg-agent
echo 'use-agent' > ~/.gnupg/gpg.conf

Passo 4: Modificar a seu Shell

Anexe o seguinte ao seu ~/.bash_profile ou ~/.bashrc ou ~/.zshrc

...
exportar GPG_TTTY=$(tty)

Passo 5: Reinicie o seu Terminal ou obtenha o seu ficheiro ~/.*rc

# sobre a base incorporada sobre o uso de macos
fonte ~/.bash_profile
# se usar bash through homebrew over ssh use
fonte ~/.bashrc
# e se usar zsh
fonte ~/.zshrc

Passo 6: Atualizar as permissões no seu ~/.gnupg Directory

Terá de modificar as permissões para 700 para assegurar este diretório.

chmod 700 ~/.gnupg

Passo 7: Matar o Agente GPG

Para garantir que não se depara com problemas, execute o comando abaixo para assegurar que um agente gpg recém-configurado é lançado.

killall gpg-agent

Passo 8: Crie a sua chave GPG

Execute o seguinte comando para gerar a sua chave, note que temos de utilizar a bandeira --expert de modo a gerar uma chave de 4096 bits.

gpg --full-gen-key

Passo 9: Responder às perguntas

Uma vez introduzidas as suas opções, a pinentry pedir-lhe-á uma palavra-passe para a nova chave PGP. Há uma série de argumentos sobre o tema das datas de validade com chaves GPG, por brevidade e para manter esta explicação simples não estamos a utilizar Subkeys neste exemplo e a mostrar um exemplo não expirado. Se quiser seguir as melhores práticas, vai querer procurar gerar uma Chave Primária e depois Subkeys e o manuseamento seguro envolvido com isso.

    Por favor selecione o tipo de chave desejado:
   (1) RSA and RSA
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
   (9) ECC (sign and encrypt) *default*
  (10) ECC (sign only)
  (14) Existing key from card
Opção? 4
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (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) 0
Key does not expire at all
Is this correct? (y/N) y

GnuPG needs to construct a user ID to identify your key.

Nome completo: Alan Denis Vargas Garcia
Endereço de correio eletrónico: alandvgarcia@gmail.com
Comentário:
Você selecionou este identificador de utilizador:
    "Alan Denis Vargas Garcia <alandvgarcia@gmail.com>"

Mudar (N)ome, (C)omentário, (E)ndereço ou (O)k/(S)air? o

Passo 10: Obtenha a sua chave para Git, etc.

# Liste as suas chaves
gpg -k

Passo 11: Obtenha a sua identificação chave

Utilize o comando seguinte para gerar uma forma curta da impressão digital chave.

Copiar o texto após o rsa4096/ e antes da data gerada e utilizar o id copiado no passo 13:

gpg -K -- formato de chave CURTO sec rsa4096/######## YYYYY-MM-DD [SC] [expira: YYYYY-MM-DD]

Precisa de copiar a saída do seu terminal semelhante ao exemplo acima onde o ######## está a seguir a barra. *

Passo 12: Exportar a impressão digital

Na saída do passo 10, a linha abaixo da linha que diz 'pub' mostra uma impressão digital - isto é o que se usa no placeholder. A saída de baixo é o que se copia para Github. A documentação sobre como fazer isso é aqui

# O comando de exportação abaixo dá-lhe a chave que você adiciona ao GitHub
gpg --armor - exportar <sua chave id>

Passo 13: Configurar o Git para usar o gpg

git config --global gpg.program $(which gpg)

Passo 14: Configurar o Git para usar a sua chave de assinatura

O comando abaixo precisa da impressão digital do passo 10 acima:

git config --global user.signingkey 1111111

Passo 15: Configurar o Git para assinar todos os commits (Opcional - você pode configurar isto por repositório também)

Isto diz a Git para assinar todos os compromissos usando a chave que especificou no passo 13.

git config --global commit.gpgsign true

Passo 16: Commit assinado

git commit -S -s -m "My Signed Commit"

Passo 17: Pinentry

Será agora solicitado por Pinentry a senha para a sua chave de assinatura. Pode introduzi-la na caixa de diálogo - com a opção de guardar a palavra-chave para o chaveiro macOS X.

Passo 18: Submeta a sua chave PGP ao Github para verificar os seus Commits

Entre em Github.com e vá às suas definições, chaves SSH e GPG, e adicione a sua chave GPG a partir da página.

Passo 19: Submeter a sua chave a um servidor de chaves público (muito opcional)

Antes de saltar ao submeter a sua chave a um serviço como o MIT PGP Key Server, deve considerar o seguinte:

  • Não pode apagar a sua chave uma vez submetida
  • Os spammers são conhecidos por colher endereços de correio eletrónicos destes servidores
  • Se só está a assinar o seus commits com Github, isto não é necessário

Resolução de problemas

Erro Sem pinentrada

Isto é causado por um programa de pinharia incorrectamente configurado. Rever o passo 2 e completar novamente a segunda parte.

Erro ## Nenhum ficheiro ou directório deste tipo

Isto é causado por uma configuração em falta para especificar o programa de pineração. Se estava a seguir uma versão anterior deste resumo que dizia que não precisava de especificar um programa de pininstração, terá de refazer a segunda parte do Passo 2.

Outros erros

Se tiver algum erro ao gerar uma chave relativa ao gpg-agent, tente o seguinte comando para ver que erro gera:

gpg-agent --daemon

Git Signing with a GUI Application (e.g. Git Tower or GitHub Desktop)

Manually Installed GPG

Step 1: Modify ~/.gnupg/gpg-agent.conf

use-standard-socket
# Below option is deprecated
pinentry-program $(brew --prefix)/bin/pinentry-mac
enable-ssh-support

Step 2: Modify ~/.gnupg/gpg.conf

use-agent
no-tty

Step 3: Restart GPG Agent

gpgconf --reload gpg-agent

Step 4: Copy startup-gpg-agent.sh to ~/bin/

Copy the .sh file in this gist to ~/bin/.

Step 5: Copy org.gnupg.gpg-agent.plist file to ~/Library/LaunchAgents/

Copy the the plist file in this Gist to ~/Library/LaunchAgents/.

Using Krypt.co

Step 1: Copy startup-gpg-agent.sh to ~/bin/

Copy the .sh file in this gist to ~/bin/.

Step 2: Copy org.gnupg.gpg-agent.plist file to ~/Library/LaunchAgents/

Copy the the plist file in this Gist to ~/Library/LaunchAgents/.

Automatically Sign Your Commits

To automatically sign all of your commits (which may be overkill), you can simply update your ~/.gitconfig file by running the below command:

git config --global commit.gpgsign true

Otherwise, run the below command per repository by navigating to the directory of the repo:

git config commit.gpgsign true
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<!-- This needs to be placed at ~/Library/LaunchAgents/org.gnupg.gpg-agent.plist -->
<plist version="1.0">
<dict>
<key>Label</key>
<string>org.gnupg.gpg-agent</string>
<key>ProgramArguments</key>
<array>
<!-- Be sure to set this path correctly! -->
<string>/Users/yourusername/bin/start-gpg-agent.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
# Ensure that gpg can find the agent when needed
if [ -f ~/.gnupg/.gpg-agent-info ] && [ -n "$(pgrep gpg-agent)" ]; then
source ~/.gnupg/.gpg-agent-info
export GPG_AGENT_INFO
else
eval $(gpg-agent --daemon --write-env-file ~/.gnupg/.gpg-agent-info)
fi
# This line is important for GUI tools to also find it
launchctl setenv GPG_AGENT_INFO $GPG_AGENT_INFO
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment