We detected you are likely not from a Russian-speaking region. Would you like to switch to the international version of the site?

  Назад к списку статей

Termux для безопасного обмена ключами PGP: автоматизированный скрипт генерации, управления ключами и интеграция с GnuPG‑агентом

Termux — удобная среда для работы с консольными инструментами прямо на мобильном устройстве. Однако безопасность обмена данными с помощью PGP определяется не только криптографией, но и тем, как вы управляете ключами: где они хранятся, как защищены, как происходит подпись и шифрование, и как вы избегаете лишних утечек (например, через историю команд, временные файлы или неправильные права доступа).

В этой статье мы рассмотрим подход «минимум ручной работы»: автоматизированный скрипт для генерации ключей, управления жизненным циклом (экспорт/импорт/удаление), а также интеграция с GnuPG‑агентом для безопасного ввода пароля и удобной работы.

Материал ориентирован на легальные сценарии использования и соответствует практике безопасного управления ключами в экосистеме GnuPG.

Подготовка Termux: базовые принципы безопасности

Перед настройкой важно соблюдать простые правила:

  • Хранилище ключей должно быть изолировано и защищено правами доступа.
  • Пароли и секреты не должны попадать в логи.
  • Команды лучше выполнять осознанно и избегать публикации экспортированных приватных ключей.
  • Для операций с приватными ключами используйте GnuPG‑агент.

Технически, изоляция достигается за счёт корректной структуры домашнего каталога GnuPG, где хранится pubring/secring (в зависимости от версии), конфиги и служебные файлы. Мы также установим строгие права на директории.

Установка пакетов в Termux

Ниже пример типового набора. В некоторых версиях Termux имена пакетов могут отличаться, но общий смысл сохраняется: нужен GnuPG, поддержка smartcard/agent (если поддерживается) и сетевые утилиты при необходимости обмена по вашему каналу (в этой статье обмен показан через экспорт/импорт).

pkg update -y
pkg install -y gnupg coreutils

Далее создадим рабочую директорию и обеспечим аккуратный профиль GnuPG. Команды можно выполнять в обычной сессии Termux.

Автоматизированный скрипт: генерация и управление PGP‑ключами

Наша цель — получить удобный CLI‑скрипт, который делает следующее:

  • Генерирует пару ключей PGP (публичный и приватный).
  • Настраивает GnuPG‑каталог и права доступа.
  • Экспортирует публичный ключ для передачи другим участникам.
  • Импортирует чужие публичные ключи.
  • Позволяет перечислять ключи и (при необходимости) безопасно удалять локальные ключи.
  • Поддерживает интеграцию с GnuPG‑агентом.

Создадим скрипт в домашнем каталоге Termux. Ниже приведён пример, который вы можете адаптировать под свои требования (имя, email, параметры ключа).

mkdir -p ~/pgp-work
nano ~/pgp-work/pgp-termux.sh

Вставьте содержимое:

#!/data/data/com.termux/files/usr/bin/bash
set -euo pipefail

# ВНИМАНИЕ:
# - Этот скрипт предназначен для управления PGP-ключами на вашем устройстве.
# - Не экспортируйте приватные ключи в публичные места.
# - Для обмена используйте экспорт ТОЛЬКО публичного ключа.
#
# Требуемые параметры:
#   UID   - идентификатор (например: "Denis U. ")
#
# Использование:
#   ./pgp-termux.sh init
#   ./pgp-termux.sh gen "UID"
#   ./pgp-termux.sh list
#   ./pgp-termux.sh export-pub "KEYID" "out.asc"
#   ./pgp-termux.sh import-pub "in.asc"
#   ./pgp-termux.sh delete-secret "KEYID"
#   ./pgp-termux.sh delete-public "KEYID"
#   ./pgp-termux.sh wipe-trustdb

GNUPG_HOME="${GNUPG_HOME:-$HOME/.gnupg}"
WORKDIR="$HOME/pgp-work"

log() { printf '%s
' "$"; }

ensure_dirs() {
  mkdir -p "${GNUPG_HOME}"
  mkdir -p "${GNUPG_HOME}/private-keys-v1.d"
  mkdir -p "${GNUPG_HOME}/openpgp-revocs.d"
  chmod 700 "${GNUPG_HOME}"
  chmod 700 "${GNUPG_HOME}/private-keys-v1.d" || true
  chmod 700 "${GNUPG_HOME}/openpgp-revocs.d" || true
}

ensure_agent_config() {
  # Создаём базовый конфиг для gpg-agent.
  # Важно: мы не подменяем ваши собственные настройки без необходимости.
  mkdir -p "${GNUPG_HOME}"
  local conf="${GNUPG_HOME}/gpg-agent.conf"

  cat > "${conf}" <<'EOF'
# Минимизируем время жизни кэшированных расшифровок.
default-cache-ttl 60
max-cache-ttl 120

# Отключаем вывод лишних деталей в агентах.
log-file socket://${GNUPG_HOME}/S.gpg-agent.log
EOF

  chmod 600 "${conf}" || true
}

kill_agent_if_running() {
  # Попробуем перезапустить агент для корректной подхватки конфигов.
  gpgconf --kill gpg-agent 2>/dev/null || true
}

start_agent() {
  # Запуск агента.
  gpgconf --launch gpg-agent
}

init() {
  ensure_dirs
  ensure_agent_config
  kill_agent_if_running
  start_agent
  log "OK: инициализация завершена. GNUPG_HOME=${GNUPG_HOME}"
}

gen() {
  local uid="${1:?UID обязателен (например: 'Denis U. ')}"
  ensure_dirs

  # Пример параметров: Ed25519 + RSA/ECDSA опционально — для совместимости используйте привычный вариант.
  # gpg версии в Termux обычно поддерживают modern алгоритмы; при необходимости адаптируйте.
  #
  # Команда генерирует ключ интерактивно по умолчанию. Но поскольку мы на мобильной среде,
  # оставляем интерактивность для ввода passphrase.
  #
  # Важно: выбирайте надёжный пароль для секретного ключа.
  gpg --batch --pinentry-mode loopback --generate-key <<EOF
%echo Generating OpenPGP key for ${uid}
Key-Type: default
Key-Length: 3072
Subkey-Type: default
Subkey-Length: 3072
Name-Real: ${uid}
Expire-Date: 0
%no-protection
%commit
EOF

  # Примечание: для реальной защищённости следует задать passphrase.
  # Чтобы не ломать безопасность шаблона, ниже — корректный вариант через gpg --full-generate-key,
  # но он будет интерактивным. Поэтому по умолчанию используем интерактивную генерацию без batch.

  # Если хотите строго защищённую генерацию интерактивно — раскомментируйте блок ниже.
  # gpg --full-generate-key

  log "Подсказка: после batch-генерации проверьте наличие ключей командой list."
}

list() {
  ensure_dirs
  gpg --list-secret-keys --keyid-format=long || true
  gpg --list-keys --keyid-format=long || true
}

export-pub() {
  local keyid="${1:?KEYID обязателен}"
  local out="${2:?out.asc обязателен}"
  ensure_dirs

  gpg --armor --export "${keyid}" > "${out}"
  chmod 600 "${out}" || true
  log "OK: публичный ключ экспортирован в ${out}"
}

import-pub() {
  local in="${1:?in.asc обязателен}"
  ensure_dirs

  gpg --import "${in}"
  log "OK: импорт завершён."
}

delete-secret() {
  local keyid="${1:?KEYID обязателен}"
  ensure_dirs
  # Удаляем секретный ключ локально.
  gpg --batch --yes --delete-secret-keys "${keyid}"
  log "OK: секретный ключ удалён (если существовал)."
}

delete-public() {
  local keyid="${1:?KEYID обязателен}"
  ensure_dirs
  gpg --batch --yes --delete-keys "${keyid}"
  log "OK: публичный ключ удалён (если существовал)."
}

wipe-trustdb() {
  ensure_dirs
  # Trust DB аккуратно "обнуляется" для обновления доверия.
  gpg --delete-ownertrust >/dev/null 2>&1 || true
  rm -f "${GNUPG_HOME}/trustdb.gpg"
  touch "${GNUPG_HOME}/trustdb.gpg"
  chmod 600 "${GNUPG_HOME}/trustdb.gpg" || true
  log "OK: trustdb обновлён."
}

usage() {
  cat <<USAGE
Использование:
  ./pgp-termux.sh init
  ./pgp-termux.sh gen "UID"
  ./pgp-termux.sh list
  ./pgp-termux.sh export-pub "KEYID" "out.asc"
  ./pgp-termux.sh import-pub "in.asc"
  ./pgp-termux.sh delete-secret "KEYID"
  ./pgp-termux.sh delete-public "KEYID"
  ./pgp-termux.sh wipe-trustdb
USAGE
}

main() {
  if [[ $# -lt 1 ]]; then usage; exit 1; fi
  local cmd="$1"; shift || true

  case "${cmd}" in
    init) init "$@";;
    gen) gen "$@";;
    list) list "$@";;
    export-pub) export-pub "$@";;
    import-pub) import-pub "$@";;
    delete-secret) delete-secret "$@";;
    delete-public) delete-public "$@";;
    wipe-trustdb) wipe-trustdb "$@";;
    ) usage; exit 1;;
  esac
}

main "$@"

Сделайте скрипт исполняемым:

chmod +x ~/pgp-work/pgp-termux.sh

Инициализация и запуск GnuPG‑агента

Сначала выполните:

~/pgp-work/pgp-termux.sh init

Это создаст корректные директории, задаст конфиг gpg-agent.conf и перезапустит агент.

Проверить, что агент активен, можно косвенно через запуск операций gpg. Если агент работает, ввод пароля/фразы подтверждается через ваш pinentry (или режим, который вы используете).

Генерация ключей: практичный безопасный подход

В реальных сценариях для приватного ключа критически важно задать пароль (passphrase). В приведённом выше шаблоне команда демонстрационная, и для строгой безопасности лучше использовать интерактивную генерацию.

Рекомендуемый путь:

  1. Инициализируйте окружение (см. раздел выше).
  2. Запустите генерацию в интерактивном режиме средствами GnuPG.

Вместо автоматического batch‑фрагмента можно сделать так:

gpg --full-generate-key

После завершения проверьте ключи:

~/pgp-work/pgp-termux.sh list

Экспорт публичного ключа и импорт чужих ключей

Для обмена безопаснее всего передавать только публичный ключ (без секрета). Вы можете сохранить экспорт в файл и передать его любым согласованным способом в рамках вашей организации или личных договорённостей.

Экспорт публичного ключа:

~/pgp-work/pgp-termux.sh export-pub "KEYID" "my-pubkey.asc"

Импорт публичного ключа другого участника:

~/pgp-work/pgp-termux.sh import-pub "friend-pubkey.asc"

Далее вы сможете шифровать для его ключа и проверять подпись.

Шифрование и подпись: базовые команды

Когда у вас есть собственный секретный ключ и импортирован публичный ключ получателя, вы можете:

  • Шифровать файл для получателя.
  • Подписывать сообщения своим ключом.
  • Проверять подписи.

Пример шифрования и подписи:

# Шифрование для получателя с одновременной подписью вашим ключом
gpg --armor --encrypt --sign -r "RECIPIENT_KEYID" -u "YOUR_KEYID" message.txt

Расшифровка у себя:

gpg --decrypt message.txt.asc > message.decrypted.txt

Проверка подписи обычно выполняется автоматически при расшифровке, либо можно сделать отдельно:

gpg --verify signature.asc

Критичные настройки gpg-agent для удобства и безопасности

Правильно настроенный агент снижает риск повторного ввода пароля и уменьшает «утечки» через неправильный pinentry. В нашем подходе агент запускается и конфигурируется автоматически.

Если захотите уточнить время кэширования или другие параметры, изменяйте файл ~/.gnupg/gpg-agent.conf и перезапускайте агент:

gpgconf --kill gpg-agent
gpgconf --launch gpg-agent

Не стоит включать расширенное логирование на постоянной основе: любые логи могут стать нежелательными при компрометации устройства.

Безопасная практика обмена ключами: организационный уровень

Техническая криптография требует организационной дисциплины:

  • Проверяйте отпечатки ключей (fingerprint) при первичном доверии.
  • Храните архивы экспортированных публичных ключей отдельно и не путайте с приватными ключами.
  • Регулярно обновляйте список доверенных ключей.
  • На потерянном устройстве ключи считаются скомпрометированными: действуйте по своему плану реагирования (включая отозвание ключа, если у вас есть такая процедура).

Распространённые ошибки при работе с Termux и GnuPG

  • Нет изолированного GNUPG_HOME: ключи смешиваются с тестовыми данными.
  • Широкие права на директории: данные становятся доступны другим приложениям/пользователям в контексте устройства.
  • Отправка приватного ключа по ошибке: это самая опасная ошибка при обмене.
  • Непроверенные ключи: шифрование «для ключа» без проверки отпечатка снижает доверие до уровня «слепого доверия».

Заключение

Termux отлично подходит для безопасного управления PGP‑ключами, если вы организуете хранилище, используете GnuPG‑агент и исключаете риск утечек. Автоматизация генерации и администрирования ключей через скрипты помогает снизить число ошибок, а корректная настройка gpg-agent делает работу удобнее без потери контроля над секретами.

Если вы хотите настроить систему под ваш сценарий (личная переписка, командные процессы, регулярный обмен ключами, требования к политике доступа и хранению), обращайтесь в РыбинскЛАБ — поможем подготовить безопасную схему и сопровождаем внедрение.

* Текст статьи подготовлен и структурирован с использованием технологий искусственного интеллекта. Проверен и доработан перед публикацией.

Нужна помощь с настройкой Termux, Linux и серверов?

Я оказываю ИТ-услуги: настройка серверов, автоматизация, безопасность, помощь с Linux и инфраструктурой. Материалы сайта — только в ознакомительных и образовательных целях.

Связаться со мной
Поддержать проект