GnuPG — реализация стандарта OpenPGP, которая приходит в дистрибутивы вместе с пакетом gnupg. Она решает две разные задачи: подпись доказывает, что файл не изменился и создан вами, шифрование скрывает содержимое от посторонних. Обе операции не требуют серверов и подписок — нужны только ключ, парольная фраза и пара команд. Разберём полный рабочий цикл: создание ключа, подпись, шифрование, доверие и резервная копия.
Создание ключа и сертификата отмены
Интерактивный мастер создаёт пару ключей и сразу предлагает задать срок действия. Для повседневных задач годят один или два года: просроченный ключ проще заменить, чем восстанавливать доверие после долгого молчания.
gpg --full-generate-key
gpg --list-secret-keys --keyid-format long
gpg --output revoke.asc --gen-revoke 0xA1B2C3D4
В мастере выбирайте тип eddsa and ecdh (Ed25519 и Curve25519) — короткие ключи, быстрая работа. Парольная фраза защищает закрытую часть ключа в памяти агента; пустую парольную фразу ставить нельзя, если ключом пользуются хоть изредка. Сертификат отмены сохраните отдельно: он позволяет объявить ключ недействительным, даже если доступ к закрытому ключу потерян.
Публичный ключ и проверка отпечатка
Публичный ключ не является секретом — его высылают всем, кому нужно проверять подписи или зашифровать для вас файл. А вот отпечаток проверяют отдельным каналом, чтобы исключить подмену при передаче.
gpg --export --armor user@example.org > public-key.asc
gpg --list-keys --keyid-format long user@example.org
gpg --fingerprint user@example.org
gpg --import public-key.asc
Отпечаток — это сокращённое представление ключа в виде групп по четыре шестнадцатеричных символа. Его сравнивают по видеозвонку, в мессенджере или на бумаге. Только после совпадения ключу выдают доверие, иначе GPG честно предупредит, что подпись сделана неизвестным лицом.
Подпись файлов
Отсоединённая подпись создаёт отдельный файл рядом с оригиналом — удобно для архивов и пакетов, содержимое которых не меняется. Клеевая подпись встраивает текст в сам документ и подходит для писем и заметок.
gpg --detach-sign --armor backup.tar.gz
gpg --verify backup.tar.gz.asc backup.tar.gz
gpg --clearsign notes.txt
gpg --verify notes.txt.asc
gpg --list-packets backup.tar.gz.asc
Флаг --armor кодирует вывод в текст, чтобы подпись можно было переслать письмом или вставить в сообщение. Проверяющая сторона получает исходный файл и файл подписи, после чего --verify сравнивает вычисленный хеш с подписанным. Статус проверки виден по коду возврата: ноль означает успех, единица — несовпадение или неизвестный ключ.
Шифрование и расшифровка
Для файла, который уходит конкретному человеку, шифрование комбинируется с подписью: получатель сразу проверяет и автора, и целостность. Симметричный режим пригодится для локального архива, который хранится на носителе без публичного ключа.
gpg --recipient 0xA1B2C3D4 --encrypt --output secrets.txt.gpg secrets.txt
gpg --decrypt --output secrets.txt secrets.txt.gpg
gpg --recipient user@example.org --sign --encrypt report.pdf
gpg --symmetric --cipher-algo AES256 archive.tar
gpg --decrypt --output archive.tar archive.tar.gpg
В скриптах и конвейерах удобно передавать данные через стандартный поток: tar czf - /srv/data | gpg --recipient 0xA1B2C3D4 --encrypt > backup.tgz.gpg. Обратите внимание, что без ключа получателя расшифровка невозможна, поэтому дубликат закрытого ключа должен существовать до того, как вы начнёте шифровать важное.
Доверие и импорт ключей
Импортированный ключ по умолчанию не даёт права на «полное доверие», и проверка подписи заканчивается предупреждением. Это защита от подмены: отпечаток должны подтвердить вручную.
gpg --import friend.asc
gpg --edit-key 0xB0B0C0C0 trust
gpg --list-keys
gpg --recv-keys 0xB0B0C0C0
gpg --check-sigs
В интерактивном режиме выбирайте пункт доверия и подтверждайте, что отпечаток проверен. Команда --check-sigs показывает, какие подписи уже поставлены на ключ, а --recv-keys подтягивает ключ с сервера — но заменить ручную проверку отпечатка она не может.
GPG в автоматизации
Скрипт не сможет ответить на запрос парольной фразы, поэтому для пакетного режима используют режим с обратным пиньоне и передачу пароля по дескриптору.
echo -n "$GPG_PASSPHRASE" | gpg --batch --yes --pinentry-mode loopback --passphrase-fd 0 --recipient 0xA1B2C3D4 --encrypt --output result.gpg data.txt
gpgconf --kill gpg-agent
gpgconf --list-dirs agent-socket
systemctl --user status gpg-agent
После ряда операций агент кэширует разблокированный ключ, и это удобно, и опасно одновременно. Разблокированная копия живёт в памяти до команды --kill или до истечения таймаута default-cache-ttl в файле ~/.gnupg/gpg-agent.conf. На общих серверах держите небольшой таймаут и не оставляйте ключ разблокированным на долгое время.
Типичные ошибки и как их читать
Большинство проблем сообщают себя внятно, если читать текст ошибки до конца. Сообщение про отсутствие закрытого ключа означает, что вы пытаетесь расшифровать файл, адресованный другому получателю, либо в агент не загружен ваш ключ. Предупреждение о неизвестном ключе при проверке подписи говорит не о подделке, а о том, что публичный ключ автора ещё не импортирован на эту машину.
gpg --decrypt --output result.txt data.txt.gpg
gpg --verify report.pdf.asc report.pdf
gpg --status-fd 1 --verify report.pdf.asc report.pdf
gpg --list-keys --with-subkey-fingerprint user@example.org
Ключи с истёкшим сроком не принимаются для шифрования, хотя старые подписи остаются проверяемыми: продлите срок через gpg --edit-key, выбрав пункт продления, либо выпустите новый ключ и уведомите контрагентов. Если агент отвечает ошибкой про сокет, перезапустите его командой gpgconf --kill gpg-agent и повторите операцию. Для скриптов полезен ключ --status-fd: он выводит машиночитаемые строки вида GOODSIG и VALIDSIG, по которым удобно проверять результат без разбора человекочитаемого текста.
Резервная копия ключей и чек-лист
gpg --export-secret-keys --armor user@example.org > secret-key.asc
gpg --export-ownertrust > ownertrust.txt
gpg --import secret-key.asc
gpg --import ownertrust.txt
- закрытый ключ выгружен и лежит на зашифрованном носителе вне основной машины;
- сертификат отмены сохранён в отдельном месте вместе с отпечатком;
- парольная фраза длинная и хранится в менеджере паролей, а не рядом с ключом;
- после замены ключа уведомлены все, кто шифрует для вас файлы;
- подпись проверяется на машине получателя, а не только у отправителя;
- заранее известен срок действия ключа и план его продления.
Итог
Подпись и шифрование с помощью GPG не требуют сложной инфраструктуры: ключ создаётся один раз, файлы подписываются одной командой, а проверка занимает секунду. Главное — правильно разложить роли: отпечаток проверяют вне каналов передачи ключа, закрытый ключ держат в копии, а автоматизация работает только с явно переданными паролями и коротким временем кэширования. С такой дисциплиной GPG становится обычным инструментом, а не экзотикой.