- Home »

Основы OpenSSL — работа с SSL-сертификатами, ключами и CSR
Если вы администрируете серверы, рано или поздно вам придётся столкнуться с SSL-сертификатами. И если раньше можно было отмахнуться от HTTPS “потом разберёмся”, то сейчас это уже не роскошь, а необходимость. Поисковики ранжируют сайты с SSL выше, браузеры пугают пользователей предупреждениями, а клиенты просто не доверяют сайтам без зелёного замочка.
OpenSSL — это швейцарский нож для работы с криптографией в мире серверов. Эта библиотека и набор утилит позволяют создавать ключи, генерировать сертификаты, подписывать CSR и делать ещё кучу полезных вещей. Проблема только в том, что синтаксис команд OpenSSL может свести с ума даже опытного админа — слишком много параметров, слишком много нюансов.
В этой статье мы разберём основы работы с OpenSSL на практике. Покажу, как быстро генерировать ключи, создавать CSR для заказа сертификатов, проверять готовые сертификаты и автоматизировать рутинные задачи. Никакой теории ради теории — только то, что пригодится в реальной работе.
Как устроен мир SSL-сертификатов
Прежде чем нырять в команды, давайте быстро разберёмся в терминологии. В SSL-инфраструктуре есть несколько ключевых компонентов:
- Приватный ключ (Private Key) — секретная часть, которую нужно хранить в безопасности на сервере
- Публичный ключ (Public Key) — открытая часть, которая встраивается в сертификат
- CSR (Certificate Signing Request) — запрос на подпись сертификата, который отправляется в CA
- Сертификат (Certificate) — подписанный CA документ, который подтверждает вашу личность
- CA (Certificate Authority) — центр сертификации, который подписывает сертификаты
Процесс получения сертификата выглядит так: генерируете приватный ключ → создаёте CSR → отправляете CSR в CA → получаете подписанный сертификат → устанавливаете на сервер.
Установка и базовая настройка OpenSSL
В большинстве Linux-дистрибутивов OpenSSL уже установлен. Проверить можно простой командой:
openssl version -a
Если OpenSSL не установлен, ставим его:
# Ubuntu/Debian
sudo apt-get install openssl
# CentOS/RHEL
sudo yum install openssl
# Или для новых версий
sudo dnf install openssl
Для комфортной работы стоит создать отдельную папку для SSL-файлов и настроить правильные права доступа:
sudo mkdir -p /etc/ssl/private
sudo chmod 700 /etc/ssl/private
sudo mkdir -p /etc/ssl/certs
sudo chmod 755 /etc/ssl/certs
Генерация приватных ключей
Начнём с создания приватного ключа. Сейчас стандартом де-факто является RSA 2048 бит, хотя многие уже переходят на 4096 бит или ECC.
Генерация RSA ключа:
# RSA 2048 бит (стандарт)
openssl genrsa -out private.key 2048
# RSA 4096 бит (повышенная безопасность)
openssl genrsa -out private.key 4096
# RSA ключ с паролем
openssl genrsa -aes256 -out private.key 2048
Для тех, кто хочет быть в тренде, можно использовать ECC (Elliptic Curve Cryptography) — более быстрый и безопасный алгоритм:
# ECC ключ (эквивалент RSA 2048)
openssl ecparam -genkey -name secp256r1 -out private.key
# ECC ключ с более высокой безопасностью
openssl ecparam -genkey -name secp384r1 -out private.key
Важный момент: если вы генерируете ключ с паролем, веб-сервер будет требовать пароль при каждом запуске. Для продакшн-серверов это не всегда удобно.
Создание CSR (Certificate Signing Request)
CSR — это запрос на подпись сертификата. Его нужно отправить в центр сертификации для получения подписанного сертификата.
Создание CSR на основе существующего ключа:
openssl req -new -key private.key -out request.csr
Система попросит ввести данные организации. Самое важное поле — Common Name (CN), туда вписываете доменное имя сайта.
Можно создать ключ и CSR одной командой:
openssl req -new -newkey rsa:2048 -nodes -keyout private.key -out request.csr
Для автоматизации можно передать все данные через параметры:
openssl req -new -key private.key -out request.csr -subj "/C=RU/ST=Moscow/L=Moscow/O=My Company/CN=example.com"
Для мультидоменных сертификатов (SAN) нужно создать конфигурационный файл:
# Создаём san.conf
cat > san.conf << EOF
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
[req_distinguished_name]
C = RU
ST = Moscow
L = Moscow
O = My Company
CN = example.com
[v3_req]
subjectAltName = @alt_names
[alt_names]
DNS.1 = example.com
DNS.2 = www.example.com
DNS.3 = mail.example.com
EOF
# Генерируем CSR с SAN
openssl req -new -key private.key -out request.csr -config san.conf
Работа с сертификатами
После получения сертификата от CA, полезно его проверить перед установкой на сервер.
Просмотр содержимого сертификата:
openssl x509 -in certificate.crt -text -noout
Проверка соответствия ключа и сертификата:
# Получаем хеш приватного ключа
openssl rsa -noout -modulus -in private.key | openssl md5
# Получаем хеш сертификата
openssl x509 -noout -modulus -in certificate.crt | openssl md5
# Хеши должны совпадать
Проверка цепочки сертификатов:
openssl verify -CAfile ca-bundle.crt certificate.crt
Проверка срока действия сертификата:
openssl x509 -in certificate.crt -noout -dates
Создание самоподписанных сертификатов
Для тестовых серверов и внутренних сервисов можно создать самоподписанный сертификат:
# Создание самоподписанного сертификата на 365 дней
openssl req -x509 -newkey rsa:2048 -keyout private.key -out certificate.crt -days 365 -nodes
# Создание самоподписанного сертификата с существующим ключом
openssl req -x509 -key private.key -in request.csr -out certificate.crt -days 365
Для разработки можно создать сертификат с SAN для нескольких локальных доменов:
# Создаём конфиг для локальной разработки
cat > dev.conf << EOF
[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
[req_distinguished_name]
C = RU
ST = Moscow
L = Moscow
O = Dev Company
CN = localhost
[v3_req]
subjectAltName = @alt_names
[alt_names]
DNS.1 = localhost
DNS.2 = *.localhost
DNS.3 = dev.local
IP.1 = 127.0.0.1
EOF
openssl req -x509 -newkey rsa:2048 -keyout dev.key -out dev.crt -days 365 -nodes -config dev.conf
Проверка SSL-соединений
OpenSSL позволяет тестировать SSL-соединения и диагностировать проблемы:
# Проверка SSL-соединения с сайтом
openssl s_client -connect example.com:443 -servername example.com
# Проверка с показом полной цепочки сертификатов
openssl s_client -connect example.com:443 -showcerts
# Проверка конкретного протокола
openssl s_client -connect example.com:443 -tls1_2
# Проверка с таймаутом
timeout 10 openssl s_client -connect example.com:443 -servername example.com
Для автоматизации проверок можно использовать скрипт:
#!/bin/bash
# ssl_check.sh
DOMAIN=$1
PORT=${2:-443}
if [ -z "$DOMAIN" ]; then
echo "Usage: $0 domain.com [port]"
exit 1
fi
echo "Checking SSL certificate for $DOMAIN:$PORT"
echo "============================================"
# Проверка соединения
timeout 10 openssl s_client -connect $DOMAIN:$PORT -servername $DOMAIN 2>/dev/null | \
openssl x509 -noout -dates -subject -issuer
# Проверка срока действия
EXPIRY=$(timeout 10 openssl s_client -connect $DOMAIN:$PORT -servername $DOMAIN 2>/dev/null | \
openssl x509 -noout -enddate | cut -d= -f2)
echo "Certificate expires: $EXPIRY"
# Проверка через секунды до истечения
EXPIRY_TIMESTAMP=$(date -d "$EXPIRY" +%s)
CURRENT_TIMESTAMP=$(date +%s)
DAYS_LEFT=$(( ($EXPIRY_TIMESTAMP - $CURRENT_TIMESTAMP) / 86400 ))
echo "Days left: $DAYS_LEFT"
if [ $DAYS_LEFT -lt 30 ]; then
echo "WARNING: Certificate expires in less than 30 days!"
fi
Преобразование форматов сертификатов
В мире SSL существует несколько форматов сертификатов. Иногда нужно конвертировать из одного формата в другой:
# PEM в DER
openssl x509 -in certificate.crt -outform DER -out certificate.der
# DER в PEM
openssl x509 -in certificate.der -inform DER -outform PEM -out certificate.crt
# PEM в PKCS#12 (для Windows)
openssl pkcs12 -export -in certificate.crt -inkey private.key -out certificate.p12
# PKCS#12 в PEM
openssl pkcs12 -in certificate.p12 -out certificate.pem -nodes
# Объединение сертификата и ключа в один файл
cat certificate.crt private.key > combined.pem
Создание собственного CA
Для внутренних проектов или тестирования можно создать собственный центр сертификации:
# Создаём корневой CA ключ
openssl genrsa -out ca.key 4096
# Создаём корневой CA сертификат
openssl req -new -x509 -key ca.key -sha256 -subj "/C=RU/ST=Moscow/L=Moscow/O=My CA/CN=My Root CA" -days 3650 -out ca.crt
# Создаём структуру папок для CA
mkdir -p ca/{certs,crl,newcerts,private}
chmod 700 ca/private
touch ca/index.txt
echo 1000 > ca/serial
# Создаём конфигурационный файл CA
cat > ca.conf << EOF
[ca]
default_ca = CA_default
[CA_default]
dir = ./ca
certs = \$dir/certs
crl_dir = \$dir/crl
new_certs_dir = \$dir/newcerts
database = \$dir/index.txt
serial = \$dir/serial
RANDFILE = \$dir/private/.rand
private_key = ./ca.key
certificate = ./ca.crt
crlnumber = \$dir/crlnumber
crl = \$dir/crl.pem
default_days = 365
default_md = sha256
preserve = no
policy = policy_loose
[policy_loose]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
EOF
# Подписываем CSR нашим CA
openssl ca -config ca.conf -in request.csr -out signed.crt
Автоматизация и скриптинг
Для автоматизации работы с сертификатами полезно создать набор скриптов. Вот пример скрипта для массовой генерации сертификатов:
#!/bin/bash
# generate_ssl.sh
DOMAIN=$1
KEY_SIZE=${2:-2048}
DAYS=${3:-365}
if [ -z "$DOMAIN" ]; then
echo "Usage: $0 domain.com [key_size] [days]"
exit 1
fi
# Создаём папку для домена
mkdir -p ssl/$DOMAIN
# Генерируем ключ
openssl genrsa -out ssl/$DOMAIN/private.key $KEY_SIZE
# Создаём CSR
openssl req -new -key ssl/$DOMAIN/private.key -out ssl/$DOMAIN/request.csr -subj "/C=RU/ST=Moscow/L=Moscow/O=My Company/CN=$DOMAIN"
# Создаём самоподписанный сертификат
openssl x509 -req -in ssl/$DOMAIN/request.csr -signkey ssl/$DOMAIN/private.key -out ssl/$DOMAIN/certificate.crt -days $DAYS
# Устанавливаем правильные права
chmod 600 ssl/$DOMAIN/private.key
chmod 644 ssl/$DOMAIN/certificate.crt
echo "SSL certificate for $DOMAIN generated in ssl/$DOMAIN/"
echo "Private key: ssl/$DOMAIN/private.key"
echo "Certificate: ssl/$DOMAIN/certificate.crt"
echo "CSR: ssl/$DOMAIN/request.csr"
Мониторинг и алерты
Важно отслеживать срок действия сертификатов. Вот скрипт для мониторинга:
#!/bin/bash
# ssl_monitor.sh
DOMAINS_FILE="domains.txt"
ALERT_DAYS=30
# Читаем список доменов из файла
while IFS= read -r domain; do
if [ -n "$domain" ]; then
echo "Checking $domain..."
# Получаем дату истечения
EXPIRY=$(timeout 10 openssl s_client -connect $domain:443 -servername $domain 2>/dev/null | \
openssl x509 -noout -enddate 2>/dev/null | cut -d= -f2)
if [ -n "$EXPIRY" ]; then
EXPIRY_TIMESTAMP=$(date -d "$EXPIRY" +%s)
CURRENT_TIMESTAMP=$(date +%s)
DAYS_LEFT=$(( ($EXPIRY_TIMESTAMP - $CURRENT_TIMESTAMP) / 86400 ))
if [ $DAYS_LEFT -lt $ALERT_DAYS ]; then
echo "ALERT: $domain certificate expires in $DAYS_LEFT days!"
# Здесь можно отправить уведомление
else
echo "OK: $domain certificate expires in $DAYS_LEFT days"
fi
else
echo "ERROR: Cannot check $domain"
fi
fi
done < "$DOMAINS_FILE"
Сравнение с альтернативными решениями
OpenSSL не единственный инструмент для работы с SSL. Есть несколько альтернатив:
Инструмент | Плюсы | Минусы | Лучший случай использования |
---|---|---|---|
OpenSSL | Универсальный, мощный, везде есть | Сложный синтаксис, много параметров | Продакшн-серверы, сложные задачи |
Let's Encrypt (certbot) | Бесплатно, автоматизация | Только DV сертификаты, короткий срок | Обычные веб-сайты |
mkcert | Простота для разработки | Только для локальной разработки | Разработка и тестирование |
cfssl | Хорошо для внутренних CA | Меньше возможностей чем OpenSSL | Корпоративные CA |
Интеграция с веб-серверами
После создания сертификатов нужно правильно настроить веб-сервер. Примеры конфигурации:
Nginx:
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/ssl/certs/certificate.crt;
ssl_certificate_key /etc/ssl/private/private.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
}
Apache:
<VirtualHost *:443>
ServerName example.com
DocumentRoot /var/www/html
SSLEngine on
SSLCertificateFile /etc/ssl/certs/certificate.crt
SSLCertificateKeyFile /etc/ssl/private/private.key
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384
SSLHonorCipherOrder off
</VirtualHost>
Безопасность и best practices
- Всегда храните приватные ключи в безопасном месте с правами доступа 600
- Используйте ключи минимум 2048 бит для RSA
- Регулярно обновляйте сертификаты до истечения срока
- Не храните ключи в системах контроля версий
- Используйте сильные пароли для защищённых ключей
- Регулярно обновляйте OpenSSL до последней версии
- Настройте мониторинг сроков действия сертификатов
Полезные ресурсы и инструменты
Для работы с SSL пригодятся следующие ресурсы:
- Официальный сайт OpenSSL
- Let's Encrypt — бесплатные SSL сертификаты
- testssl.sh — скрипт для тестирования SSL
- SSL Labs Server Test — онлайн проверка настроек SSL
Если вы планируете серьёзно заниматься настройкой серверов, рекомендую арендовать VPS или выделенный сервер для практики и тестирования.
Заключение и рекомендации
OpenSSL — это мощный инструмент, который должен быть в арсенале каждого системного администратора. Да, синтаксис может показаться сложным, но базовые операции довольно просты, если знать правильные команды.
Основные рекомендации:
- Создайте себе шпаргалку с основными командами OpenSSL
- Автоматизируйте рутинные задачи через скрипты
- Настройте мониторинг сроков действия сертификатов
- Для простых случаев используйте Let's Encrypt
- Для внутренних проектов не бойтесь создавать собственный CA
- Всегда тестируйте сертификаты перед установкой в продакшн
Помните: SSL — это не просто "зелёный замочек" в браузере. Это основа безопасности современного интернета. Потратьте время на изучение OpenSSL, и вы сможете решать большинство задач, связанных с SSL-сертификатами, быстро и эффективно.
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.