Lezioni online Bitcoin-only
This project is maintained by valerio-vaccaro
Officine Bitcoin Lição Bitcoin-only Este projeto é mantido por valerio-vaccaro
🇨🇳 中文 🇬🇧 English 🇪🇸 Español 🇵🇹 Português 🇷🇺 Русский 🇫🇷 Français 🇩🇪 Deutsch 🇮🇹 Italiano 🇭🇺 Magyar 🏳️ Milanés 🏳️ Veneto
Esta aula orienta você no uso do Gnu Privacy Guard (GPG):
Ela foi pensada para Linux, com comandos testados em GPG 2.2.40/Debian 12. Os mesmos comandos podem funcionar de modo semelhante em outras versões de Linux e também em MacOSX e Windows (exceto para sistemas de arquivos criptografados).
O processo segue boas práticas de segurança, como geração de chaves offline e backups seguros.
Instale gpg e os utilitários necessários
sudo apt update
sudo apt install gnupg scdaemon pcscd yubikey-manager
Certifique-se de que a versão seja 2.1.17 ou posterior (2.4.5 recomendada).
gpg --version
Verifique o funcionamento da YubiKey
ykman info
Garanta que o applet OpenPGP esteja habilitado e que o modo CCID esteja ativo.
Use uma máquina isolada da rede (sem internet) para gerar as chaves e evitar vazamentos.
Lembre-se de que os PINs padrão da YubiKey não são seguros e são:
Gere um par de chaves GPG primário (pública e privada) apenas para certificação (C); todas as outras chaves derivarão dele.
Inicie a geração de chaves usando –expert para opções avançadas.
gpg --expert --full-gen-key
Selecione o tipo de chave:
Please select what kind of key you want:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
(7) DSA (set your own capabilities)
(8) RSA (set your own capabilities)
(9) ECC and ECC
(10) ECC (sign only)
(11) ECC (set your own capabilities)
(13) Existing key
(14) Existing key from card
Your selection? 8
Escolha (8) RSA (set your own capabilities) para personalizar o comportamento da chave.
Configure as capacidades:
Possible actions for a RSA key: Sign Certify Encrypt Authenticate
Current allowed actions: Sign Certify Encrypt
(S) Toggle the sign capability
(E) Toggle the encrypt capability
(A) Toggle the authenticate capability
(Q) Finished
Your selection? S
Desative Sign e Encrypt (pressione S, E).
Mantenha Certify (pressione Q quando terminar).
Como resultado, apenas Certify permanece entre as ações permitidas.
Configure o tamanho da chave:
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (3072) 4096
Digite 4096 (máximo suportado pela YubiKey 4/5).
Configure a expiração:
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0)
Digite 3y (3 anos) ou sua preferência. Confirme a data.
Digite o User ID:
GnuPG needs to construct a user ID to identify your key.
Real name: Satoshi Spritz
Email address: info@satoshispritz.it
Comment:
You selected this USER-ID:
"Satoshi Spritz <info@satoshispritz.it>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o
Informe nome e e-mail. Deixe o comentário em branco. Confirme com O.
Digite uma passphrase forte (misture letras, números e símbolos; evite palavras comuns).
Exemplo: Tr0ub4dor&3xplor3r!2025
A passphrase protege sua chave privada.
Gere entropia movendo o mouse, digitando aleatoriamente ou usando rng-tools (Linux e somente se você entender bem):
sudo apt install rng-tools
sudo rngd -r /dev/urandom
Aguarde a conclusão da geração da chave. Anote o key ID (por exemplo, C2033656849FC82BA3C365E33C9BF8B9CB86875D) na saída:
gpublic and secret key created and signed.
pub rsa2048 2025-07-20 [C]
C2033656849FC82BA3C365E33C9BF8B9CB86875D
uid Satoshi Spritz <info@satoshispritz.it>
Crie um certificado de revogação caso a chave seja comprometida (seu cliente pode já tê-lo criado):
gpg --output revoke_master_satoshispritz.asc --gen-revoke C2033656849FC82BA3C365E33C9BF8B9CB86875D
Escolha o motivo (por exemplo, 1 = chave comprometida) e salve.
Crie subchaves de assinatura e criptografia. Duas subchaves serão adicionadas para assinatura (S) e criptografia (E).
A chave primária permanece apenas para certificação.
Edite a chave:
gpg --expert --edit-key C2033656849FC82BA3C365E33C9BF8B9CB86875D
Digite a passphrase se solicitado.
Adicione a subchave de assinatura:
gpg> addkey
Please select what kind of key you want:
(3) DSA (sign only)
(4) RSA (sign only)
(5) Elgamal (encrypt only)
(6) RSA (encrypt only)
(7) DSA (set your own capabilities)
(8) RSA (set your own capabilities)
(10) ECC (sign only)
(11) ECC (set your own capabilities)
(12) ECC (encrypt only)
(13) Existing key
(14) Existing key from card
Your selection? 4
Escolha (4) RSA (sign only).
Configure o tamanho: 4096.
Configure a expiração: 2y (2 anos, subchaves podem ser rotacionadas com mais frequência).
Confirme e digite a passphrase.
Adicione a subchave de criptografia:
gpg> addkey
Escolha (6) RSA (encrypt only).
Configure o tamanho: 4096.
Configure a expiração: 2y.
Confirme e digite a passphrase.
Salve as alterações:
gpg> save
Verifique as subchaves:
gpg --list-keys --with-subkey-fingerprints C2033656849FC82BA3C365E33C9BF8B9CB86875D
Saída de exemplo:
pub rsa4096 2025-07-20 [C] [expires: 2028-07-20]
C2033656849FC82BA3C365E33C9BF8B9CB86875D
uid [ultimate] Satoshi Spritz <info@satoshispritz.it>
sub rsa4096 2025-07-20 [S] [expires: 2027-07-20]
1E3C548D2CA2927D205C1A85426E4AB8E6D72AC3
sub rsa4096 2025-07-20 [E] [expires: 2027-07-20]
94C11C615BE049B97899FA3C8DC3736F499D6C3E
Anote as fingerprints das subchaves de assinatura (S) e criptografia (E).
Backup de todas as chaves. Faça backup da chave primária, das subchaves e da chave pública em duas unidades USB criptografadas por segurança.
Prepare as unidades USB: insira duas unidades USB (por exemplo, /dev/sdb e /dev/sdc).
Crie partições criptografadas (por exemplo, com LUKS):
sudo cryptsetup luksFormat /dev/sdb1
sudo cryptsetup luksOpen /dev/sdb1 backup1
sudo mkfs.ext4 /dev/mapper/backup1
sudo mount /dev/mapper/backup1 /mnt/backup1
Repita para /dev/sdc1 (por exemplo, montada em /mnt/backup2).
Exporte as chaves privadas: exporte a chave primária e as subchaves:
gpg --armor --export-secret-keys C2033656849FC82BA3C365E33C9BF8B9CB86875D! > /mnt/backup1/secret_master_satoshispritz.asc
gpg --armor --export-secret-keys 1E3C548D2CA2927D205C1A85426E4AB8E6D72AC3! > /mnt/backup2/secret_sign_satoshispritz.asc
gpg --armor --export-secret-keys 94C11C615BE049B97899FA3C8DC3736F499D6C3E! > /mnt/backup2/secret_encrypt_satoshispritz.asc
Exporte as chaves públicas:
gpg --armor --export C2033656849FC82BA3C365E33C9BF8B9CB86875D! > /mnt/backup1/public_master_satoshispritz.asc
gpg --armor --export 1E3C548D2CA2927D205C1A85426E4AB8E6D72AC3! > /mnt/backup2/public_sign_satoshispritz.asc
gpg --armor --export 94C11C615BE049B97899FA3C8DC3736F499D6C3E! > /mnt/backup2/public_encrypt_satoshispritz.asc
Exporte o certificado de revogação:
cp revoke_master_satoshispritz.asc /mnt/backup1/revoke_master_satoshispritz.asc
cp revoke_master_satoshispritz.asc /mnt/backup2/revoke_master_satoshispritz.asc
Desmonte com segurança:
sudo umount /mnt/backup1
sudo cryptsetup luksClose backup1
Repita para backup2. Guarde as unidades USB em locais separados e seguros (por exemplo, cofre).
Exclua as chaves locais (opcional): se estiver usando uma máquina isolada da rede, exclua o diretório GPG:
rm -rf ~/.gnupg
Depois disso, as chaves precisarão ser importadas na máquina em que serão usadas.
Se a máquina não estiver isolada da rede, mantenha as chaves até transferi-las para a YubiKey.
Transfira as subchaves de assinatura e criptografia para a YubiKey, mantendo a chave primária offline.
Insira a Yubikey e verifique:
gpg --card-status
A saída deve mostrar o applet OpenPGP (por exemplo, Version: 2.0).
Altere os PINs padrão:
gpg --change-pin
User PIN: defina um novo PIN de 6-8 dígitos (por exemplo, 654321). Admin PIN: defina um novo PIN de 8 dígitos (por exemplo, 87654321).
Edite a chave para transferência:
gpg --expert --edit-key C2033656849FC82BA3C365E33C9BF8B9CB86875D
Selecione e transfira a subchave de assinatura: liste as chaves para identificar os índices das subchaves:
gpg> list
Exemplo:
sec rsa4096/3C9BF8B9CB86875D
created: 2025-07-20 expires: 2028-07-20 usage: C
trust: ultimate validity: ultimate
ssb rsa4096/426E4AB8E6D72AC3
created: 2025-07-20 expires: 2027-07-20 usage: S
ssb rsa4096/8DC3736F499D6C3E
created: 2025-07-20 expires: 2027-07-20 usage: E
Selecione a subchave de assinatura:
gpg> key 1
A subchave de assinatura terá um asterisco (*).
Transfira para a YubiKey:
gpg> keytocard
Please select where to store the key:
(1) Signature key
(3) Authentication key
Your selection?
Digite o Admin PIN (por exemplo, 87654321). A subchave privada de assinatura é transferida para a YubiKey e substituída por um stub no keyring.
Selecione e transfira a subchave de criptografia: desselecione a subchave de assinatura:
gpg> key 1
Selecione a subchave de criptografia:
gpg> key 2
Transfira para a YubiKey:
gpg> keytocard
Please select where to store the key:
(2) Encryption key
Your selection? 2
Digite o Admin PIN novamente.
Salve as alterações:
gpg> save
As subchaves privadas agora estão na YubiKey, com stubs locais.
Verifique a YubiKey:
gpg --card-status
Verifique se os slots Signature key e Encryption key mostram as fingerprints das subchaves.
Exporte as subchaves privadas (para verificar o backup):
gpg --armor --export-secret-subkeys C2033656849FC82BA3C365E33C9BF8B9CB86875D > secret-subkeys-satoshispritz.asc
Exclua o diretório GPG local:
rm -rf ~/.gnupg
Reimporte a chave pública e os stubs:
gpg --import public.asc
gpg --import secret-subkeys-satoshispritz.asc
A chave privada primária não está mais no computador.
Use a YubiKey para criptografar e assinar um arquivo para um destinatário.
Prepare um arquivo de teste:
echo "This is a secret message." > test.txt
Obtenha a chave pública do destinatário (por exemplo, bob@example.com):
gpg --keyserver hkps://keys.openpgp.org --search-keys bob@example.com
Ou importe de um arquivo:
gpg --import bob_public.asc
Criptografe e assine: criptografe para bob@example.com e assine com Yubikey:
gpg --encrypt --sign --recipient bob@example.com test.txt
Digite o User PIN (por exemplo, 654321) quando solicitado.
Se a YubiKey exigir confirmação por toque (opcional, configurada via ykman openpgp keys set-touch), toque na YubiKey.
A saída será test.txt.gpg
Descriptografe o arquivo (requer YubiKey):
gpg --decrypt test.txt.gpg > test_decrypted.txt
Digite o User PIN e toque na Yubikey se necessário.
Verifique se test_decrypted.txt corresponde a test.txt.
Bob pode descriptografar com sua chave privada e verificar sua assinatura:
gpg --decrypt test.txt.gpg
Se você quiser apenas assinar o arquivo, pode usar os seguintes comandos.
gpg --detach-sign test.txt
Isso gerará um arquivo de saída chamado test.txt.sig
Para verificá-lo:
gpg --verify test.txt.sig test.txt
gpg --expert --edit-key C2033656849FC82BA3C365E33C9BF8B9CB86875D
gpg> addkey
Transfira novas subchaves para a YubiKey e atualize a chave pública nos servidores:
gpg --keyserver hkps://keys.openpgp.org --send-keys C2033656849FC82BA3C365E33C9BF8B9CB86875D
Use uma segunda YubiKey para redundância:
gpg --import secret.asc
gpg --expert --edit-key C2033656849FC82BA3C365E33C9BF8B9CB86875D
Repita os passos de keytocard para a segunda YubiKey.
Se precisar resetar a Yubikey:
ykman openpgp reset
Para restaurar subchaves a partir do backup:
gpg --import secret.asc
“Public Key Not Usable”: certifique-se de que a chave pública do destinatário foi importada e é confiável:
gpg --edit-key bob@example.com
gpg> trust
Defina como 5 = Ultimate trust.