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. Мы поможем спроектировать, настроить и обслуживать инфраструктуру сертификатов под любые задачи, от небольших приложений до корпоративных систем.