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

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

Разработка собственного менеджера сертификатов и PKI‑инфраструктуры в Termux: генерация, ротация и автоматическая проверка отзыва

Termux предоставляет полноценную Linux‑окружение на Android‑устройстве, что делает его отличной площадкой для экспериментов с криптографией и управлением сертификатами. В этой статье мы построим собственный менеджер сертификатов и PKI‑инфраструктуру, автоматизируем ротацию ключей и реализуем проверку отзыва (CRL) без привлечения сторонних сервисов.

Установка необходимых пакетов

Для работы с PKI нам потребуются инструменты openssl и cron. Установим их через пакетный менеджер Termux:

pkg update && pkg upgrade -y
pkg install openssl cronie -y

После установки запустим планировщик:

sv-enable crond
sv start crond

Создание корневого сертификата (Root CA)

Корневой сертификат – основа всей инфраструктуры. Сгенерируем закрытый ключ и самоподписанный сертификат с длительным сроком действия (10 лет).

# Генерация 4096‑битного RSA‑ключа
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096 -out rootCA.key

# Самоподпись сертификата
openssl req -x509 -new -nodes -key rootCA.key \
    -sha256 -days 3650 \
    -subj "/C=RU/ST=Rostov/L=Rostov/O=RybinskLab/OU=PKI/CN=RybinskLab Root CA" \
    -out rootCA.crt

Сохраняем rootCA.key и rootCA.crt в защищённом каталоге ~/.pki/root и ограничиваем доступ:

mkdir -p ~/.pki/root && mv rootCA. ~/.pki/root/
chmod 600 ~/.pki/root/rootCA.key
chmod 644 ~/.pki/root/rootCA.crt

Создание промежуточного сертификата (Intermediate CA)

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

# Создаём каталог для промежуточного CA
mkdir -p ~/.pki/intermediate && cd ~/.pki/intermediate

# Генерация ключа
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096 -out intermediate.key

# Запрос на подпись (CSR)
openssl req -new -key intermediate.key \
    -subj "/C=RU/ST=Rostov/L=Rostov/O=RybinskLab/OU=PKI/CN=RybinskLab Intermediate CA" \
    -out intermediate.csr

# Подпись запросом корневым CA
openssl x509 -req -in intermediate.csr \
    -CA ~/.pki/root/rootCA.crt -CAkey ~/.pki/root/rootCA.key \
    -CAcreateserial -out intermediate.crt -days 3650 -sha256

# Формирование цепочки сертификатов
cat intermediate.crt ~/.pki/root/rootCA.crt > chain.crt
chmod 600 intermediate.key
chmod 644 intermediate.crt chain.crt

Генерация клиентского/серверного сертификата

Пример создания сертификата для приложения, использующего TLS.

# Параметры сертификата
COMMON_NAME="app.example.com"

# Генерация ключа (EC‑P256)
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:prime256v1 -out ${COMMON_NAME}.key

# CSR
openssl req -new -key ${COMMON_NAME}.key \
    -subj "/C=RU/ST=Rostov/L=Rostov/O=RybinskLab/OU=Apps/CN=${COMMON_NAME}" \
    -out ${COMMON_NAME}.csr

# Подпись промежуточным CA
openssl x509 -req -in ${COMMON_NAME}.csr \
    -CA ~/.pki/intermediate/intermediate.crt -CAkey ~/.pki/intermediate/intermediate.key \
    -CAcreateserial -out ${COMMON_NAME}.crt -days 825 -sha256

# Объединяем сертификат и цепочку
cat ${COMMON_NAME}.crt ~/.pki/intermediate/chain.crt > ${COMMON_NAME}_full.crt
chmod 600 ${COMMON_NAME}.key
chmod 644 ${COMMON_NAME}_full.crt

Автоматическая ротация сертификатов

Для обеспечения актуальности сертификатов рекомендуется их ротация за 30 дней до истечения срока. Реализуем скрипт rotate_cert.sh и планируем его запуск через crontab.

#!/data/data/com.termux/files/usr/bin/bash

BASE_DIR="$HOME/.pki"
INTERMEDIATE="$BASE_DIR/intermediate"
ROOT="$BASE_DIR/root"

# Параметры ротации
DAYS_BEFORE=30

# Функция проверки срока действия
check_and_renew() {
    local cert=$1
    local name=$(basename "$cert" .crt)
    local expire=$(openssl x509 -enddate -noout -in "$cert" | cut -d= -f2)
    local expire_ts=$(date -d "$expire" +%s)
    local now_ts=$(date +%s)
    local diff=$(( (expire_ts - now_ts) / 86400 ))
    if (( diff <= DAYS_BEFORE )); then
        echo "[INFO] Сертификат $name истекает через $diff дней – генерируем новый."
        # Здесь вызываем функцию генерации (пример для клиентского сертификата)
        /data/data/com.termux/files/home/rotate_client.sh "$name"
    else
        echo "[INFO] Сертификат $name ещё действителен ($diff дней)."
    fi
}

# Проверяем все клиентские сертификаты в каталоге apps
for crt in "$BASE_DIR/apps"/.crt; do
    [[ -e "$crt" ]] && check_and_renew "$crt"
done

Сохраняем скрипт, делаем его исполняемым и добавляем задачу в cron (ежедневно в 02:00):

chmod +x ~/rotate_cert.sh
(crontab -l 2>/dev/null; echo "0 2    $HOME/rotate_cert.sh >> $HOME/rotate.log 2>&1") | crontab -

Автоматическая проверка отзыва (CRL)

Для отзыва сертификатов создаём список отозванных (CRL) в корневом CA и публикуем его в локальном каталоге. Клиентские приложения будут проверять актуальность CRL перед установкой соединения.

# В корневом CA создаём CRL (каждые 7 дней)
mkdir -p $HOME/.pki/crl && cd $HOME/.pki/root

# Генерация CRL (пока без отозванных сертификатов)
openssl ca -gencrl -keyfile rootCA.key -cert rootCA.crt -out crl/rootCA.crl -crldays 7 -crlreason unspecified

# Обновление CRL при отзыве
revoke_cert() {
    local serial=$1
    openssl ca -revoke $serial -keyfile rootCA.key -cert rootCA.crt
    openssl ca -gencrl -keyfile rootCA.key -cert rootCA.crt -out crl/rootCA.crl -crldays 7
}

# Пример отзыва сертификата с серийным номером 01
# revoke_cert 01

Планируем обновление CRL:

(crontab -l 2>/dev/null; echo "30 3  * 0 $HOME/.pki/root/update_crl.sh >> $HOME/crl.log 2>&1") | crontab -

В клиентском приложении проверка выглядит так (пример на Bash):

#!/data/data/com.termux/files/usr/bin/bash
CERT=$1
CRL=$HOME/.pki/crl/rootCA.crl

if openssl verify -crl_check -CAfile $HOME/.pki/root/rootCA.crt -CRLfile $CRL $CERT >/dev/null; then
    echo "Сертификат $CERT действителен."
else
    echo "Сертификат $CERT отозван или недействителен!"
    exit 1
fi

Интеграция менеджера в Termux‑окружение

  • Создайте набор алиасов в ~/.bashrc для быстрого доступа к операциям (gen‑root, gen‑intermediate, gen‑client, rotate‑cert, check‑crl).
  • Используйте переменные окружения PKI_HOME=$HOME/.pki для унификации путей.
  • Для приложений на Android, которые работают в Termux, передавайте сертификаты через openvpn --ca $PKI_HOME/root/rootCA.crt или аналогичные параметры.

Заключение

Созданный в Termux менеджер сертификатов позволяет полностью контролировать процесс выпуска, ротации и отзыва сертификатов без обращения к сторонним сервисам. Автоматизация с помощью crond гарантирует своевременное обновление ключей и CRL, а открытый исходный код упрощает аудит безопасности.

Если вы хотите ускорить внедрение PKI‑решений в ваших мобильных проектах, воспользоваться готовыми шаблонами скриптов или получить профессиональную поддержку – обратитесь к специалистам RybinskLab. Мы поможем спроектировать, настроить и обслуживать инфраструктуру сертификатов под любые задачи, от небольших приложений до корпоративных систем.

* Текст статьи подготовлен и структурирован с использованием технологий искусственного интеллекта. Проверен экспертом РыбинскЛАБ.

Поделиться знанием:

Нужна профессиональная помощь?

Меня зовут Усачёв Денис Евгеньевич. Я оказываю ИТ-услуги в Рыбинске и Ярославской области: настройка серверов, безопасность, автоматизация бизнеса. Запомните информация развлекательный ознакомительный носит, не нарушайте закон!

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