Home » Основы OpenSSL — работа с SSL-сертификатами, ключами и CSR
Основы OpenSSL — работа с SSL-сертификатами, ключами и CSR

Основы 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 пригодятся следующие ресурсы:

Если вы планируете серьёзно заниматься настройкой серверов, рекомендую арендовать VPS или выделенный сервер для практики и тестирования.

Заключение и рекомендации

OpenSSL — это мощный инструмент, который должен быть в арсенале каждого системного администратора. Да, синтаксис может показаться сложным, но базовые операции довольно просты, если знать правильные команды.

Основные рекомендации:

  • Создайте себе шпаргалку с основными командами OpenSSL
  • Автоматизируйте рутинные задачи через скрипты
  • Настройте мониторинг сроков действия сертификатов
  • Для простых случаев используйте Let's Encrypt
  • Для внутренних проектов не бойтесь создавать собственный CA
  • Всегда тестируйте сертификаты перед установкой в продакшн

Помните: SSL — это не просто "зелёный замочек" в браузере. Это основа безопасности современного интернета. Потратьте время на изучение OpenSSL, и вы сможете решать большинство задач, связанных с SSL-сертификатами, быстро и эффективно.


В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.

Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.

Leave a reply

Your email address will not be published. Required fields are marked