Public Key Infrastructure (PKI) – фундаментальная часть любой системы, где требуется шифрование и аутентификация. В Termux, мощном терминальном эмуляторе для Android, можно развернуть полностью автономную PKI, используя лишь openssl. В этой статье мы пройдем от установки до полного жизненного цикла сертификатов.
Что понадобится
- Устройство под управлением Android с установленным Termux.
- Доступ к интернету для установки пакетов.
- Базовые знания работы в командной строке.
Установка OpenSSL в Termux
pkg update && pkg upgrade -y
pkg install openssl -y
После установки проверьте версию:
openssl version
Организация каталогов PKI
Структура каталогов упрощает управление сертификатами и ключами.
mkdir -p ~/pki/{root,intermediate,certs,crl,newcerts,private}
chmod 700 ~/pki/root/private
chmod 700 ~/pki/intermediate/private
Создадим необходимые файлы индекса и счётчики:
touch ~/pki/root/index.txt
echo 1000 > ~/pki/root/serial
touch ~/pki/intermediate/index.txt
echo 1000 > ~/pki/intermediate/serial
Создание корневого сертификата (Root CA)
Сначала генерируем закрытый ключ. Рекомендуется использовать RSA‑4096 или EC‑P‑384.
# RSA‑4096
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096 \
-out ~/pki/root/private/ca.key.pem
chmod 400 ~/pki/root/private/ca.key.pem
# EC‑P‑384 (альтернатива)
# openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:secp384r1 \
# -out ~/pki/root/private/ca.key.pem
Создаём самоподписанный сертификат:
openssl req -config <(cat <<'EOF'
[ req ]
default_bits = 4096
prompt = no
default_md = sha256
distinguished_name = dn
x509_extensions = v3_ca
[ dn ]
C = RU
ST = Ryazan
L = Ryazan
O = MyRootCA
OU = PKI Department
CN = MyRootCA
[ v3_ca ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical,CA:true,pathlen:1
keyUsage = critical, digitalSignature, cRLSign, keyCertSign
EOF
) -key ~/pki/root/private/ca.key.pem \
-new -x509 -days 3650 -sha256 \
-out ~/pki/root/certs/ca.cert.pem
chmod 444 ~/pki/root/certs/ca.cert.pem
Проверим сертификат:
openssl x509 -noout -text -in ~/pki/root/certs/ca.cert.pem
Создание промежуточного сертификата (Intermediate CA)
Промежуточный центр позволяет ограничить срок действия корневого ключа.
# Генерация ключа
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096 \
-out ~/pki/intermediate/private/intermediate.key.pem
chmod 400 ~/pki/intermediate/private/intermediate.key.pem
# Запрос на сертификат (CSR)
openssl req -new -sha256 \
-key ~/pki/intermediate/private/intermediate.key.pem \
-subj "/C=RU/ST=Ryazan/L=Ryazan/O=MyIntermediateCA/OU=PKI Department/CN=MyIntermediateCA" \
-out ~/pki/intermediate/csr/intermediate.csr.pem
# Подпись CSR корневым CA
openssl ca -config <(cat <<'EOF'
[ ca ]
default_ca = myca
[ myca ]
dir = ~/pki/root
certificate = $dir/certs/ca.cert.pem
private_key = $dir/private/ca.key.pem
new_certs_dir = $dir/newcerts
database = $dir/index.txt
serial = $dir/serial
default_md = sha256
policy = policy_anything
copy_extensions = copy
[ policy_anything ]
countryName = optional
stateOrProvinceName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ v3_intermediate_ca ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical,CA:true,pathlen:0
keyUsage = critical, digitalSignature, cRLSign, keyCertSign
EOF
) -extensions v3_intermediate_ca \
-days 3650 -notext -md sha256 \
-in ~/pki/intermediate/csr/intermediate.csr.pem \
-out ~/pki/intermediate/certs/intermediate.cert.pem
chmod 444 ~/pki/intermediate/certs/intermediate.cert.pem
Создаём цепочку сертификатов (certificate chain) для дальнейшего использования:
cat ~/pki/intermediate/certs/intermediate.cert.pem \
~/pki/root/certs/ca.cert.pem > ~/pki/intermediate/certs/ca-chain.cert.pem
Выпуск серверного сертификата
Серверный сертификат будет подписан промежуточным CA.
# Генерация ключа сервера
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 \
-out ~/pki/certs/server.key.pem
chmod 400 ~/pki/certs/server.key.pem
# CSR для сервера (указываем SAN)
openssl req -new -sha256 \
-key ~/pki/certs/server.key.pem \
-subj "/C=RU/ST=Ryazan/L=Ryazan/O=MyServer/OU=Web/CN=example.com" \
-addext "subjectAltName = DNS:example.com, DNS:www.example.com" \
-out ~/pki/certs/server.csr.pem
# Подпись CSR промежуточным CA
openssl ca -config <(cat <<'EOF'
[ ca ]
default_ca = myintermediate
[ myintermediate ]
dir = ~/pki/intermediate
certificate = $dir/certs/intermediate.cert.pem
private_key = $dir/private/intermediate.key.pem
new_certs_dir = $dir/newcerts
database = $dir/index.txt
serial = $dir/serial
default_md = sha256
policy = policy_anything
copy_extensions = copy
[ policy_anything ]
countryName = optional
stateOrProvinceName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ v3_server_cert ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
basicConstraints = CA:false
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = example.com
DNS.2 = www.example.com
EOF
) -extensions v3_server_cert \
-days 825 -notext -md sha256 \
-in ~/pki/certs/server.csr.pem \
-out ~/pki/certs/server.cert.pem
chmod 444 ~/pki/certs/server.cert.pem
# Объединяем сертификат сервера и цепочку
cat ~/pki/certs/server.cert.pem \
~/pki/intermediate/certs/ca-chain.cert.pem > ~/pki/certs/server.fullchain.pem
Проверяем соответствие ключа и сертификата:
openssl x509 -noout -modulus -in ~/pki/certs/server.cert.pem | openssl md5
openssl rsa -noout -modulus -in ~/pki/certs/server.key.pem | openssl md5
Отзыв сертификатов и создание CRL
Для отзыва достаточно добавить запись в базу index.txt и сгенерировать список отозванных сертификатов (CRL).
# Отзовём сертификат с серийным номером, полученным из сертификата
SERIAL=$(openssl x509 -noout -serial -in ~/pki/certs/server.cert.pem | cut -d'=' -f2)
openssl ca -config <(cat <<'EOF'
[ ca ]
default_ca = myintermediate
[ myintermediate ]
dir = ~/pki/intermediate
certificate = $dir/certs/intermediate.cert.pem
private_key = $dir/private/intermediate.key.pem
new_certs_dir = $dir/newcerts
database = $dir/index.txt
serial = $dir/serial
default_md = sha256
policy = policy_anything
EOF
) -revoke ~/pki/certs/server.cert.pem
# Генерация CRL (Certificate Revocation List)
openssl ca -config <(cat <<'EOF'
[ ca ]
default_ca = myintermediate
[ myintermediate ]
dir = ~/pki/intermediate
certificate = $dir/certs/intermediate.cert.pem
private_key = $dir/private/intermediate.key.pem
new_certs_dir = $dir/newcerts
database = $dir/index.txt
serial = $dir/serial
crlnumber = $dir/crlnumber
default_md = sha256
policy = policy_anything
crl_extensions = crl_ext
[ crl_ext ]
authorityKeyIdentifier=keyid:always
EOF
) -gencrl -out ~/pki/intermediate/crl/intermediate.crl.pem
chmod 444 ~/pki/intermediate/crl/intermediate.crl.pem
Проверка CRL:
openssl crl -noout -text -in ~/pki/intermediate/crl/intermediate.crl.pem
Проверка цепочки сертификатов
openssl verify -CAfile ~/pki/intermediate/certs/ca-chain.cert.pem \
-crl_check ~/pki/intermediate/crl/intermediate.crl.pem \
~/pki/certs/server.cert.pem
Если сертификат отозван, в выводе будет сообщение certificate revoked.
Автоматизация с помощью скриптов
Для упрощения повторяющихся задач удобно собрать набор функций в небольшом bash‑скрипте pki.sh. Примерный шаблон:
#!/usr/bin/env bash
set -euo pipefail
PKI_ROOT=~/pki
function init_root() {
mkdir -p "$PKI_ROOT/root/{private,certs,newcerts}" && chmod 700 "$PKI_ROOT/root/private"
touch "$PKI_ROOT/root/index.txt"
echo 1000 > "$PKI_ROOT/root/serial"
# генерация ключа и сертификата – см. раздел выше
}
function create_server_cert() {
local CN=$1
local SAN=$2
# генерация ключа, CSR и подпись – аналогично приведённому коду
}
# Добавьте парсинг аргументов и вызов нужных функций
Сохраните файл, сделайте его исполняемым (chmod +x pki.sh) и используйте ./pki.sh create_server_cert example.com "DNS:example.com,DNS:www.example.com".
Заключение
Termux предоставляет полноценную Linux‑среду на Android‑устройстве, а openssl позволяет построить собственную инфраструктуру PKI без привлечения сторонних сервисов. Мы рассмотрели процесс создания корневого и промежуточного CA, выпуск серверных сертификатов, их отзыв и проверку цепочки. Такая автономная система пригодна как для разработки, так и для небольших продакшн‑проектов, где требуется быстрый и надёжный контроль над сертификатами.
Если вы хотите автоматизировать процесс развертывания PKI, интегрировать его в CI/CD, или нуждаетесь в профессиональном аудите безопасности вашего инфраструктурного решения, команда RybinskLab готова помочь. Мы предоставляем услуги по настройке и поддержке криптографических систем, разработке кастомных скриптов и обучению персонала. Свяжитесь с нами, чтобы вывести ваш проект на новый уровень надёжности.