gpg
GnuPG — ключи, шифрование для получателя и по паролю, подписи, экспорт и импорт, работа в скриптах
gpg (GnuPG) шифрует и подписывает файлы по стандарту OpenPGP. Два режима шифрования: асимметричный — для владельца открытого ключа (-e -r), расшифрует только он своим секретным ключом; симметричный — по паролю (-c). Подпись (-s, -b) доказывает, кто создал файл и что он не изменён. Ключи хранятся в ~/.gnupg (или в каталоге из GNUPGHOME), секретными ключами управляет фоновый процесс gpg-agent.
Синтаксис
gpg [опции] команда [файл…]
Результат пишется рядом с исходным файлом (file.gpg, file.asc, file.sig) или туда, куда указывает -o. Служебные сообщения идут в stderr.
Ключи
| Команда | Что делает |
|---|---|
--quick-gen-key 'Имя <почта>' [алг] [назначение] [срок] | создать ключ одной командой; default default never — по умолчанию, без срока |
--gen-key | создать ключ интерактивно (спросит имя и почту) |
--full-generate-key | интерактивно со всеми вопросами: алгоритм, размер, срок |
-k, --list-keys [кто] | открытые ключи |
-K, --list-secret-keys [кто] | секретные ключи |
--fingerprint [кто] | отпечатки ключей (для сверки по другому каналу) |
--export [-a] кто | выгрузить открытый ключ |
--export-secret-keys -a кто | выгрузить секретный ключ (для резервной копии) |
--import файл | загрузить ключи из файла |
--delete-keys кто / --delete-secret-keys кто | удалить открытый / секретный ключ |
--delete-secret-and-public-key отпечаток | удалить оба |
--edit-key кто | интерактивное меню: trust, expire, passwd, adduid… |
--lsign-key кто | подписать чужой ключ локально, то есть признать его доверенным |
--generate-revocation кто | сертификат отзыва (при создании ключа он уже лежит в openpgp-revocs.d/) |
«Кто» — почта, часть имени, ID или отпечаток ключа.
Шифрование и подписи
| Команда | Что делает |
|---|---|
-e, --encrypt -r получатель | зашифровать для получателя; -r можно повторять |
-c, --symmetric | зашифровать паролем (AES256) |
-d, --decrypt | расшифровать (и проверить подпись, если она внутри) в stdout или в -o |
-s, --sign | подписать: файл и подпись вместе, в двоичном виде |
--clear-sign | подпись к тексту, сам текст остаётся читаемым |
-b, --detach-sign | подпись в отдельном файле .sig (или .asc с -a) |
--verify подпись [файл] | проверить подпись; для отдельной подписи укажи и файл |
-se -r кто | подписать и зашифровать за один проход |
Общие опции
| Опция | Что делает |
|---|---|
-a, --armor | текстовый вид (-----BEGIN PGP …) вместо двоичного |
-o файл | куда писать результат; -o - — stdout |
-u кто | каким секретным ключом подписывать |
-r кто | получатель |
--batch | ничего не спрашивать — для скриптов |
--yes | отвечать «да» (например, на перезапись файла) |
-q / -v | тише / подробнее |
--passphrase пароль / --passphrase-file файл / --passphrase-fd 0 | пароль без запроса (только вместе с --batch) |
--pinentry-mode loopback | брать пароль от секретного ключа из --passphrase*, а не через окно pinentry |
--trust-model always | не спрашивать о доверии к ключу получателя |
--homedir каталог | другой каталог с ключами (или переменная GNUPGHOME) |
--keyid-format long | показывать длинные ID ключей |
--with-colons | машиночитаемый вывод списков |
Как читать список ключей
pub ed25519 2026-10-13 [SC] [expires: 2027-10-13]
AC3AF46A56A58FA3A3DEA82BEA804362494F223C
uid [ultimate] Alice <alice@example.com>
sub cv25519 2026-10-13 [E]
pub/sec — основной ключ (открытый/секретный), sub/ssb — подключ; длинная строка — отпечаток. Буквы назначения: S — подпись, C — сертификация ключей, E — шифрование, A — аутентификация. В скобках у uid — уровень доверия: ultimate — твой ключ, unknown — импортированный, которому ты ещё не доверяешь.
Примеры
# отдельный каталог ключей — не трогает основной ~/.gnupg
export GNUPGHOME=$(mktemp -d)
# ключ без пароля одной командой (для тестов и автоматики)
gpg --batch --passphrase '' --quick-gen-key 'Alice <alice@example.com>' default default never
gpg -k
# зашифровать для получателя и расшифровать
echo 'top secret' > msg.txt
gpg -e -r alice@example.com msg.txt # → msg.txt.gpg
gpg -d msg.txt.gpg # текст в stdout
gpg -q -d -o plain.txt msg.txt.gpg # в файл
# текстовый вид — удобно вставить в письмо или YAML
gpg -a -e -r alice@example.com -o msg.asc msg.txt
# по паролю, без вопросов — в скрипте
gpg --batch --yes --passphrase 'pw' -c -o backup.tar.gpg backup.tar
gpg --batch --passphrase 'pw' -d -o backup.tar backup.tar.gpg
# пароль из файла, а не из командной строки
gpg --batch --passphrase-file /root/.backup-pass -d backup.tar.gpg > backup.tar
# отдельная подпись к релизу и её проверка
gpg -u alice@example.com -b -o release.tar.sig release.tar
gpg --verify release.tar.sig release.tar
# обмен ключами
gpg -a --export alice@example.com > alice.pub
gpg --import alice.pub
gpg --fingerprint alice@example.com
# в скрипте, когда секретный ключ защищён паролем
gpg --batch --pinentry-mode loopback --passphrase "$KEY_PASS" -d secret.gpg
# удалить ключ без вопросов (в batch-режиме — только по отпечатку)
gpg --batch --yes --delete-secret-and-public-key AC3AF46A56A58FA3A3DEA82BEA804362494F223C
Коды выхода
0 — успех (подпись верна, расшифровано); 1 — подпись не верна (BAD signature); 2 — прочие ошибки: нет ключа, неверный пароль, отказ из-за доверия.
Подводные камни
- Пароль от секретного ключа в
--batchне принимается без--pinentry-mode loopback. Ошибка —Inappropriate ioctl for device. Для симметричного-cи для генерации ключа хватает--batch --passphrase. gpg-agentкеширует пароль от ключа. После одного успешного ввода следующие расшифровки идут без пароля. Чтобы проверить, что пароль действительно нужен, сбрось агента:gpgconf --kill gpg-agent.- Импортированный ключ «не доверенный».
gpg --batch -e -r …откажется шифровать:There is no assurance this key belongs to the named user … Unusable public key. Сверь отпечаток и подпиши ключ (--lsign-key) или в автоматике явно укажи--trust-model always. - Существующий файл результата. Без
--yesgpgспрашивает про перезапись, в--batch— падает сFile exists, а без терминала — сcannot open '/dev/tty'. В скриптах добавляй--batch --yes. --verifyвстроенной подписи не проверяет внешний файл.gpg --verify file.asc fileдля--clear-sign-подписи предупредитnot a detached signature; file … was NOT verified. Для проверки отдельного файла подпись нужно создавать через-b.--passphraseв командной строке виден вpsи остаётся в истории. Используй--passphrase-fileили--passphrase-fd.- Удаление в batch-режиме — только по отпечатку. По почте получишь
can't do this in batch mode (unless you specify the key by fingerprint). И сначала удаляется секретный ключ, потом открытый — или сразу--delete-secret-and-public-key. --quick-gen-keyс тем жеuidвторой раз откажется:A key for "…" already exists. Добавь--yes, если второй ключ действительно нужен.- Права на каталог ключей.
GNUPGHOMEдолжен принадлежать тебе и иметь права700, иначе каждая команда печатаетWARNING: unsafe permissions on homedir. Каталог изmktemp -dуже подходит.