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

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

Построение собственного механизма подписи и проверки целостности скриптов в Termux

Руководство по созданию системы цифровых подписей для скриптов в Termux с использованием OpenSSL: генерация ключей, подписание, верификация и автоматизация проверки целостности.

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