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). В приведённом выше шаблоне команда демонстрационная, и для строгой безопасности лучше использовать интерактивную генерацию.
Рекомендуемый путь:
- Инициализируйте окружение (см. раздел выше).
- Запустите генерацию в интерактивном режиме средствами 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 делает работу удобнее без потери контроля над секретами.
Если вы хотите настроить систему под ваш сценарий (личная переписка, командные процессы, регулярный обмен ключами, требования к политике доступа и хранению), обращайтесь в РыбинскЛАБ — поможем подготовить безопасную схему и сопровождаем внедрение.