Настройка 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
Онлайн тесты
- SSL Labs: https://www.ssllabs.com/ssltest/
- Security Headers: https://securityheaders.com/
- SSL Server Test: https://www.immuniweb.com/ssl/
Проверка 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 для выявления потенциальных уязвимостей.