Termux предоставляет полноценную Linux‑среду на Android‑устройствах, что делает его отличной площадкой для развертывания лёгких серверов (HTTP, SSH, VPN и т.д.). Одним из ключевых аспектов безопасной работы таких серверов является корректное управление TLS/SSL сертификатами. В этой статье мы рассмотрим, как полностью автоматизировать процесс создания, подписи и ротации сертификатов с помощью openssl и встроенного планировщика crond в Termux.
Подготовка окружения
Установим необходимые пакеты и настроим базовые пути.
pkg update && pkg upgrade -y
pkg install openssl cronie termux-api -y
mkdir -p $HOME/ssl/{private,certs,csr}
chmod 700 $HOME/ssl/private
Папка $HOME/ssl будет хранить все материалы: закрытые ключи, запросы сертификатов (CSR) и готовые сертификаты.
Создание корневого сертификата (CA)
Для автономного управления сертификатами удобно создать собственный центр сертификации (CA). Это позволяет подписывать сертификаты без обращения к внешним сервисам.
# Генерация закрытого ключа CA (RSA 4096 бит)
openssl genpkey -algorithm RSA -out $HOME/ssl/private/ca.key -pkeyopt rsa_keygen_bits:4096
chmod 600 $HOME/ssl/private/ca.key
# Самоподписанный сертификат CA (valid 10 лет)
openssl req -x509 -new -nodes -key $HOME/ssl/private/ca.key \
-sha256 -days 3650 -out $HOME/ssl/certs/ca.crt \
-subj "/C=RU/ST=Moscow/L=Moscow/O=RybinskLab/OU=MobileServers/CN=RybinskLab-CA"
Сохранённый сертификат ca.crt необходимо добавить в доверенные корни на клиентских устройствах, если вы планируете использовать его в публичных сервисах.
Шаблон скрипта для генерации серверного сертификата
Ниже представлен Bash‑скрипт generate_cert.sh, который автоматизирует процесс создания закрытого ключа, CSR и подписи сертификата CA.
#!/usr/bin/env bash
# Параметры (можно переопределить через переменные окружения)
DOMAIN=${1:-"example.com"}
DAYS=${2:-365}
KEY_DIR="$HOME/ssl/private"
CSR_DIR="$HOME/ssl/csr"
CERT_DIR="$HOME/ssl/certs"
CA_KEY="$KEY_DIR/ca.key"
CA_CERT="$CERT_DIR/ca.crt"
# Генерация закрытого ключа сервера (RSA 2048)
SERVER_KEY="$KEY_DIR/${DOMAIN}.key"
openssl genpkey -algorithm RSA -out "$SERVER_KEY" -pkeyopt rsa_keygen_bits:2048
chmod 600 "$SERVER_KEY"
# Создание CSR
SERVER_CSR="$CSR_DIR/${DOMAIN}.csr"
openssl req -new -key "$SERVER_KEY" -out "$SERVER_CSR" \
-subj "/C=RU/ST=Moscow/L=Moscow/O=RybinskLab/OU=MobileServers/CN=${DOMAIN}"
# Подписание сертификата CA
SERVER_CERT="$CERT_DIR/${DOMAIN}.crt"
openssl x509 -req -in "$SERVER_CSR" -CA "$CA_CERT" -CAkey "$CA_KEY" \
-CAcreateserial -out "$SERVER_CERT" -days "$DAYS" -sha256
# Вывод результатов
echo "Certificate generated: $SERVER_CERT"
echo "Private key: $SERVER_KEY"
Сделайте скрипт исполняемым:
chmod +x $HOME/ssl/generate_cert.sh
Автоматическая ротация сертификатов
Для обеспечения непрерывной безопасности рекомендуется обновлять сертификаты за 30 дней до истечения срока их действия. В Termux это удобно реализовать через crond и небольшую обёртку.
# Файл: $HOME/ssl/renew_certs.sh
#!/usr/bin/env bash
# Список доменов, для которых требуется ротация (можно хранить в файле)
DOMAINS=("example.com" "api.example.com")
for d in "${DOMAINS[@]}"; do
# Проверяем оставшееся время жизни сертификата (в днях)
EXPIRY=$(openssl x509 -enddate -noout -in "$HOME/ssl/certs/${d}.crt" | cut -d= -f2)
EXPIRY_TS=$(date -d "$EXPIRY" +%s)
NOW_TS=$(date +%s)
DAYS_LEFT=$(( (EXPIRY_TS - NOW_TS) / 86400 ))
if [ "$DAYS_LEFT" -le 30 ]; then
echo "[$(date)] Renewing $d (expires in $DAYS_LEFT days)"
$HOME/ssl/generate_cert.sh "$d" 365
# Перезапуск сервиса (пример для nginx)
termux-notification --title "RybinskLab" --content "Certificate for $d renewed, restarting nginx"
# Пример команды рестарта (зависит от установленного сервера)
# pkill -f nginx && nginx
else
echo "[$(date)] $d is still valid ($DAYS_LEFT days left)"
fi
done
Сделайте скрипт исполняемым:
chmod +x $HOME/ssl/renew_certs.sh
Добавьте задачу в crontab (только один раз):
crontab -e
# Добавьте строку (каждый день в 03:00)
0 3 * $HOME/ssl/renew_certs.sh >> $HOME/ssl/renew.log 2>&1
Запустите демон crond и убедитесь, что он будет автоматически стартовать после перезагрузки Termux:
sv-enable crond
sv up crond
Интеграция с мобильными приложениями и API
Termux‑API позволяет отправлять уведомления, записывать логи в системный журнал и даже управлять Wi‑Fi. Пример отправки уведомления после успешного обновления сертификата уже показан выше. При необходимости можно добавить отправку POST‑запроса в ваш мониторинговый сервис:
curl -X POST -H "Content-Type: application/json" \
-d '{"host":"${d}","status":"renewed","timestamp":"$(date +%s)"}' \
https://monitor.rlb.io/certificates
Лучшие практики безопасности
- Храните закрытые ключи в директории с правом
700и ограничьте доступ к Termux (пароль/биометрия). - Регулярно бэкапьте
ca.keyи все серверные ключи в зашифрованный архив (openssl enc -aes-256-cbc). - Используйте отдельный пользователь (в Termux это можно эмулировать через
proot) для изоляции сервисов. - Включайте проверку отзыва сертификатов (OCSP) в клиентских приложениях.
Отладка и проверка
Проверить корректность сертификата можно командой:
openssl s_client -connect localhost:443 -servername example.com -showcerts
Для более глубокого анализа используйте openssl x509 -text -noout -in … и сравните поля Not After и Subject.
Заключение
Автоматизация управления TLS/SSL сертификатами в Termux открывает новые возможности для развертывания полноценного веб‑инфраструктурного стека непосредственно на Android‑устройствах. С помощью openssl, crond и Termux‑API вы получаете гибкую, безопасную и полностью кастомизируемую систему, которая легко интегрируется в существующие DevOps‑процессы.
Если вам требуется профессиональная настройка мобильных серверов, аудит безопасности или разработка кастомных скриптов под Termux, команда RybinskLab готова помочь. Мы предоставляем услуги по консалтингу, настройке CI/CD, а также поддержке и мониторингу ваших мобильных инфраструктур.