Termux предоставляет полноценную Linux-среду на Android без root-прав. Исполнение сторонних скриптов несет риски: модификация кода, внедрение вредоносных команд, утечка данных. Стандартные средства пакетного менеджера (apt) используют GPG для верификации репозиториев, но для собственных или загруженных скриптов требуется автономный механизм контроля целостности и авторства.
Статья описывает построение системы на базе OpenSSL (ECDSA P-256 / SHA-256): генерация пары ключей, подписание скриптов, верификацию перед запуском и интеграцию в рабочий процесс. Все операции выполняются в пользовательском пространстве Termux, не требуют root и соответствуют требованиям ФСТЭК к средствам электронной подписи (ГОСТ Р 34.10-2012 не рассматривается из-за отсутствия нативной поддержки в OpenSSL 3.x без engine).
Подготовка окружения
pkg update && pkg upgrade -y
pkg install openssl termux-api -y
Проверка версии OpenSSL (должна быть 3.0+ для поддержки ECDSA P-256 без deprecated API):
openssl version
Создание рабочей директории с ограниченными правами:
mkdir -p ~/.local/bin ~/.local/share/scriptsig/{keys,signed,verified}
chmod 700 ~/.local/share/scriptsig/keys
Генерация пары ключей ECDSA P-256
Используем эллиптическую кривую prime256v1 (NIST P-256). Приватный ключ шифруется AES-256-CBC с паролем.
cd ~/.local/share/scriptsig/keys
openssl ecparam -name prime256v1 -genkey -noout -out private.pem
openssl ec -in private.pem -aes256 -out private_enc.pem
rm private.pem
openssl ec -in private_enc.pem -pubout -out public.pem
Пароль для приватного ключа вводится интерактивно. Для автоматизации можно использовать переменную окружения OPENSSL_PASS (не рекомендуется для продакшена).
Резервное копирование публичного ключа в безопасное хранилище (например, зашифрованный архив на внешнем носителе):
tar -czf ~/scriptsig_pubkey_backup.tar.gz public.pem
# Перенести на другой девайс/накопитель
Подписание скрипта
Скрипт подписывается в детач-режиме (отдельный файл подписи). Формат: бинарная DER-подпись.
sign_script() {
local script="$1"
local sig="${script}.sig"
if [[ ! -f "$script" ]]; then
echo "Script not found: $script" >&2
return 1
fi
openssl dgst -sha256 -sign ~/.local/share/scriptsig/keys/private_enc.pem -out "$sig" "$script"
echo "Signed: $sig"
}
export -f sign_script
Использование:
sign_script ~/myscript.sh
Результат: myscript.sh.sig — бинарная подпись.
Верификация подписи
Проверка целостности и авторства перед исполнением.
verify_script() {
local script="$1"
local sig="${script}.sig"
if [[ ! -f "$script" || ! -f "$sig" ]]; then
echo "Missing script or signature" >&2
return 1
fi
openssl dgst -sha256 -verify ~/.local/share/scriptsig/keys/public.pem -signature "$sig" "$script"
}
export -f verify_script
Код возврата 0 — подпись верна. Вывод Verified OK при успехе.
Автоматизация: wrapper для безопасного запуска
Скрипт-обертка, который верифицирует и запускает только при валидной подписи. Поместить в ~/.local/bin/run_signed:
#!/data/data/com.termux/files/usr/bin/bash
# run_signed — безопасный запуск подписанных скриптов
set -euo pipefail
SCRIPT="$1"
shift || { echo "Usage: run_signed