Перейти к основному содержимому

Настройка SSL сертификатов

Подробное руководство по настройке SSL сертификатов для различных сценариев.

Типы SSL сертификатов

Let's Encrypt (бесплатные)

Бесплатные сертификаты от Let's Encrypt с автоматическим обновлением.

Преимущества:

  • Бесплатные
  • Автоматическое обновление
  • Поддержка wildcard сертификатов

Ограничения:

  • Срок действия 90 дней
  • Лимиты на количество запросов

Коммерческие сертификаты

Платные сертификаты от коммерческих центров сертификации.

Преимущества:

  • Расширенная валидация (EV)
  • Больший срок действия
  • Техническая поддержка

Настройка Let's Encrypt

Базовая установка

# Установка Certbot
sudo apt update
sudo apt install certbot python3-certbot-nginx

# Получение сертификата для домена
sudo certbot --nginx -d example.com -d www.example.com

# Проверка статуса
sudo certbot certificates

Wildcard сертификаты

# Получение wildcard сертификата
sudo certbot certonly \
--manual \
--preferred-challenges dns \
-d example.com \
-d "*.example.com" \
--server https://acme-v02.api.letsencrypt.org/directory

# Добавление TXT записи в DNS
# _acme-challenge.example.com TXT "generated-token"

Автоматическое обновление

# Настройка автоматического обновления
sudo systemctl enable certbot.timer
sudo systemctl start certbot.timer

# Проверка таймера
sudo systemctl status certbot.timer

# Тестирование обновления
sudo certbot renew --dry-run

Настройка коммерческих сертификатов

Генерация CSR

# Создание приватного ключа
openssl genrsa -out example.com.key 2048

# Создание запроса на сертификат (CSR)
openssl req -new -key example.com.key -out example.com.csr

# Просмотр CSR
openssl req -text -noout -verify -in example.com.csr

Установка сертификата

# Загрузка сертификатов от CA
# example.com.crt - основной сертификат
# intermediate.crt - промежуточный сертификат
# root.crt - корневой сертификат

# Создание цепочки сертификатов
cat example.com.crt intermediate.crt > example.com-fullchain.crt

# Установка прав доступа
sudo chmod 600 example.com.key
sudo chmod 644 example.com-fullchain.crt

Конфигурация Nginx

Базовая SSL конфигурация

# /etc/nginx/conf.d/example.com.conf

server {
listen 80;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}

server {
listen 443 ssl http2;
server_name example.com www.example.com;

# SSL сертификаты
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

# SSL настройки
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;

# SSL оптимизация
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;

# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
resolver 8.8.8.8 8.8.4.4 valid=300s;

# Заголовки безопасности
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Frame-Options DENY always;
add_header X-Content-Type-Options nosniff always;
add_header X-XSS-Protection "1; mode=block" always;

root /var/www/example.com;
index index.html index.php;

location / {
try_files $uri $uri/ =404;
}
}

Продвинутая SSL конфигурация

# /etc/nginx/nginx.conf

http {
# SSL общие настройки
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;

# DH параметры для Forward Secrecy
ssl_dhparam /etc/nginx/dhparam.pem;

# SSL кэш
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 1d;
ssl_session_tickets off;

# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;

include /etc/nginx/conf.d/*.conf;
}

Генерация DH параметров

# Генерация strong DH группы
sudo openssl dhparam -out /etc/nginx/dhparam.pem 2048

# Для повышенной безопасности (медленнее)
sudo openssl dhparam -out /etc/nginx/dhparam.pem 4096

Конфигурация Apache

Базовая SSL конфигурация

# /etc/apache2/sites-available/example.com-ssl.conf

<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com

# SSL Engine
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem

# SSL Protocol и Ciphers
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384
SSLHonorCipherOrder off

# HSTS
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"

# OCSP Stapling
SSLUseStapling on
SSLStaplingCache shmcb:/tmp/stapling_cache(128000)

ErrorLog ${APACHE_LOG_DIR}/example.com_ssl_error.log
CustomLog ${APACHE_LOG_DIR}/example.com_ssl_access.log combined
</VirtualHost>

# Редирект с HTTP на HTTPS
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
Redirect permanent / https://example.com/
</VirtualHost>

Тестирование SSL

Проверка сертификата

# Проверка сертификата
openssl s_client -connect example.com:443 -servername example.com

# Проверка срока действия
openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates

# Проверка цепочки сертификатов
openssl s_client -connect example.com:443 -showcerts

Онлайн тесты

Проверка OCSP Stapling

# Проверка OCSP Stapling
openssl s_client -connect example.com:443 -status -servername example.com

# Проверка с curl
curl -I --tlsv1.2 https://example.com

Обновление сертификатов

Автоматическое обновление Let's Encrypt

# Создание скрипта обновления
sudo nano /etc/cron.d/certbot

# Содержимое файла:
0 12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew --deploy-hook "systemctl reload nginx"

Ручное обновление

# Обновление всех сертификатов
sudo certbot renew

# Обновление конкретного сертификата
sudo certbot renew --cert-name example.com

# Принудительное обновление
sudo certbot renew --force-renewal

Мониторинг сертификатов

Скрипт проверки срока действия

#!/bin/bash
# check-ssl-expiry.sh

DOMAIN="example.com"
DAYS_WARNING=30

EXPIRY_DATE=$(openssl s_client -connect $DOMAIN:443 -servername $DOMAIN 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2)
EXPIRY_EPOCH=$(date -d "$EXPIRY_DATE" +%s)
CURRENT_EPOCH=$(date +%s)
DAYS_LEFT=$(( ($EXPIRY_EPOCH - $CURRENT_EPOCH) / 86400 ))

if [ $DAYS_LEFT -lt $DAYS_WARNING ]; then
echo "ВНИМАНИЕ: Сертификат для $DOMAIN истекает через $DAYS_LEFT дней!"
# Отправка уведомления
fi
Автоматизация

Настройте мониторинг срока действия сертификатов и автоматические уведомления за 30 дней до истечения.

Безопасность

Регулярно проверяйте конфигурацию SSL через SSL Labs для выявления потенциальных уязвимостей.