← Весь справочник

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.
  • Существующий файл результата. Без --yes gpg спрашивает про перезапись, в --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 уже подходит.

См. также

openssl · checksums · base64 · ssh · tar