SSL (Secure Sockets Layer) и его преемник TLS (Transport Layer Security) — это криптографические протоколы, которые обеспечивают безопасную передачу данных между клиентом и сервером по протоколу HTTPS. В повседневной речи оба протокола часто называют просто «SSL», хотя технически SSL уже устарел и заменён на TLS.
В этой статье мы подробно разберём:
- Что такое SSL-сертификаты и как они работают.
- Какие типы сертификатов существуют и как их получить.
- Установку и настройку Let’s Encrypt (бесплатный и автоматический способ).
- Настройку SSL в Nginx и Apache с практическими примерами.
- Ручную установку платного сертификата.
- Продвинутые темы: HSTS, автоматическое обновление, проверка безопасности.
1. Что такое SSL-сертификат и как он работает
SSL-сертификат — это цифровой документ, который удостоверяет подлинность веб-сайта и позволяет шифровать данные между браузером пользователя и сервером.
1.1 Принцип работы SSL/TLS
- Браузер подключается к серверу по HTTPS.
- Сервер отправляет свой сертификат (публичный ключ, подписанный доверенным центром).
- Браузер проверяет сертификат (не истёк ли срок, подписан ли доверенным центром, соответствует ли домену).
- Если проверка пройдена, клиент и сервер договариваются о сеансовом ключе шифрования (рукопожатие).
- Все дальнейшие данные шифруются с помощью этого ключа.
1.2 Основные компоненты сертификата
- Публичный ключ — используется для шифрования данных.
- Приватный ключ — хранится на сервере, используется для расшифровки.
- Подпись — цифровая подпись центра сертификации (CA), подтверждающая подлинность.
- Срок действия — дата, до которой сертификат считается валидным.
- Common Name (CN) и Subject Alternative Names (SAN) — домены, для которых действителен сертификат.
1.3 Типы SSL-сертификатов
| Тип | Особенности | Срок выдачи | Использование |
|---|---|---|---|
| Domain Validation (DV) | Проверяется только владение доменом | Минуты | Личные сайты, блоги, небольшие проекты |
| Organization Validation (OV) | Проверяется организация | Часы–дни | Корпоративные сайты, магазины |
| Extended Validation (EV) | Полная проверка юридического лица | Дни–недели | Финансовые и крупные проекты (даёт зелёную строку) |
| Wildcard | Действует на все поддомены (*.example.com) | Как у соответствующего типа | Сайты с множеством поддоменов |
| Multi-Domain (SAN) | Действует на несколько разных доменов | Как у соответствующего типа | Компании с разными сайтами |
Для большинства веб-проектов достаточно DV-сертификата от Let’s Encrypt — он бесплатный, надёжный и автоматически обновляется.
2. Let’s Encrypt — бесплатный и современный подход
Let’s Encrypt — это бесплатный центр сертификации, который выдаёт DV-сертификаты сроком на 90 дней. Главное преимущество — автоматизация: сертификаты можно обновлять без ручного вмешательства.
2.1 Установка Certbot
Certbot — официальный клиент для получения и обновления сертификатов Let’s Encrypt.
Установка на Ubuntu/Debian:
sudo apt update
sudo apt install certbot python3-certbot-nginx # для Nginx
# или
sudo apt install certbot python3-certbot-apache # для ApacheУстановка на CentOS/RHEL:
sudo dnf install certbot python3-certbot-nginx # для Nginx
# или
sudo dnf install certbot python3-certbot-apache # для Apache2.2 Получение сертификата
С автоматической настройкой веб-сервера (Nginx):
sudo certbot --nginx -d example.com -d www.example.comС автоматической настройкой веб-сервера (Apache):
sudo certbot --apache -d example.com -d www.example.comС ручной настройкой (без изменения конфигурации сервера):
sudo certbot certonly --nginx -d example.com -d www.example.com
# или
sudo certbot certonly --apache -d example.com -d www.example.com
# или с веб-корнем
sudo certbot certonly --webroot -w /var/www/example/public -d example.com -d www.example.comВ интерактивном режиме вас попросят указать email для уведомлений, согласиться с условиями и выбрать, нужно ли перенаправлять HTTP → HTTPS.
2.3 Где хранятся сертификаты
После успешной генерации сертификаты сохраняются по пути:
/etc/letsencrypt/live/ваш_домен/
Файлы:
fullchain.pem— полная цепочка сертификатов (ваш сертификат + промежуточные).privkey.pem— приватный ключ.cert.pem— только ваш сертификат (редко используется).chain.pem— цепочка промежуточных сертификатов.
В конфигурации веб-сервера нужно указывать именно fullchain.pem и privkey.pem.
2.4 Автоматическое обновление
Сертификаты Let’s Encrypt действительны 90 дней, поэтому их нужно обновлять. Certbot создаёт cron-задачу или systemd-таймер автоматически.
Проверка статуса обновления:
sudo systemctl status certbot.timer # на systemd
sudo crontab -l # если добавлено в cronРучное обновление:
sudo certbot renewПринудительное обновление даже для неистекших:
sudo certbot renew --force-renewal2.5 Настройка веб-сервера после получения сертификата
Если вы использовали автоматическую настройку (certbot --nginx или --apache), конфигурация будет изменена автоматически. В противном случае нужно настроить вручную.
3. Настройка SSL в Nginx
3.1 Базовая конфигурация HTTPS
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com www.example.com;
# Пути к сертификатам
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:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
# off — для TLS 1.3 клиент сам выбирает шифр (рекомендуется Mozilla)
ssl_prefer_server_ciphers off;
ssl_dhparam /etc/ssl/dhparam.pem;
# Оптимизация производительности
ssl_session_cache shared:SSL:10m;
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;
# HSTS (HTTP Strict Transport Security)
add_header Strict-Transport-Security "max-age=63072000" always;
# Остальные заголовки безопасности
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
root /var/www/example/public;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}3.2 Перенаправление HTTP → HTTPS
Добавьте отдельный server-блок для порта 80:
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}Или с сохранением оригинального хоста:
server {
listen 80;
listen [::]:80;
server_name _;
return 301 https://$host$request_uri;
}3.3 Поддержка нескольких доменов (SAN)
Если сертификат выдан для нескольких доменов, их все нужно указать в server_name:
server {
listen 443 ssl http2;
server_name example.com www.example.com site2.com www.site2.com;
# ...
}3.4 Включение HTTP/2
HTTP/2 значительно ускоряет загрузку страниц. Он включается директивой http2 после параметра ssl:
listen 443 ssl http2;3.5 Проверка конфигурации и перезагрузка
nginx -t
sudo systemctl reload nginx4. Настройка SSL в Apache
4.1 Базовая конфигурация HTTPS
Включите модуль SSL:
sudo a2enmod ssl
sudo systemctl restart apache2Конфигурация виртуального хоста для HTTPS:
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example/public
# Пути к сертификатам
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
# Настройки безопасности
SSLProtocol all -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:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
SSLHonorCipherOrder off
# Оптимизация
SSLSessionCache shmcb:/var/cache/apache2/ssl_scache(512000)
SSLSessionCacheTimeout 300
SSLUseStapling on
SSLStaplingCache shmcb:/var/run/ocsp(128000)
# HSTS
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
<Directory /var/www/example/public>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/example_error.log
CustomLog ${APACHE_LOG_DIR}/example_access.log combined
</VirtualHost>4.2 Перенаправление HTTP → HTTPS
Создайте отдельный виртуальный хост для порта 80:
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
Redirect permanent / https://example.com/
</VirtualHost>4.3 Проверка конфигурации и перезагрузка
sudo apachectl configtest
sudo systemctl reload apache25. Ручная установка платного SSL-сертификата
Если вы приобрели платный сертификат (например, от Comodo, DigiCert, Sectigo), его обычно присылают в виде файлов:
your_domain.crt— ваш сертификат.ca_bundle.crtилиintermediate.crt— цепочка промежуточных сертификатов.private.key— приватный ключ.
Шаги:
- Объедините сертификаты в один файл (если требуется):
cat your_domain.crt ca_bundle.crt > fullchain.pem2. Скопируйте файлы в защищённую директорию:
sudo mkdir -p /etc/ssl/example
sudo cp fullchain.pem /etc/ssl/example/
sudo cp private.key /etc/ssl/example/
sudo chmod 600 /etc/ssl/example/private.key- В конфигурации веб-сервера укажите пути к этим файлам (как в примерах выше).
- Не забудьте настроить автоматическое обновление (платные сертификаты часто выдаются на 1 год, так что нужно будет заменять вручную или через скрипты).
6. Продвинутые темы
6.1 HSTS (HTTP Strict Transport Security)
HSTS заставляет браузер всегда использовать HTTPS, даже если пользователь вводит HTTP. Это защищает от атак типа «человек посередине» и снижения протокола.
Осторожно с preload: попадание в preload-список браузеров практически необратимо. Добавляйте preload только если уверены, что все ваши поддомены (включая будущие) будут работать по HTTPS. Сначала протестируйте без preload, убедитесь, что всё работает, и только потом добавляйте. Для подачи в список зайдите на .
В Nginx:
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;В Apache:
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"Параметры:
max-age— время (в секундах), в течение которого браузер должен запоминать правило (63072000 = 2 года).includeSubDomains— применять правило ко всем поддоменам.preload— включить домен в предзагруженный список HSTS (для максимальной защиты).
6.2 Проверка безопасности SSL
После настройки обязательно проверьте свой сертификат на ошибки и уязвимости:
- SSL Labs — онлайн-тест, который выдаёт оценку безопасности (A+ — отлично).
- SecurityHeaders.com — проверяет заголовки безопасности, включая HSTS.
- Command line:
openssl s_client -connect example.com:443 -tls1_26.3 Автоматическое обновление Let’s Encrypt с перезагрузкой сервера
Если сервисы не перезагружаются автоматически после обновления, добавьте в crontab:
0 0 * * * certbot renew --quiet && systemctl reload nginx
# или
0 0 * * * certbot renew --quiet && systemctl reload apache26.4 Сертификат для Wildcard (*.example.com)
Let’s Encrypt поддерживает Wildcard-сертификаты, но их выдача требует подтверждения через DNS (не через webroot).
Получение Wildcard-сертификата:
sudo certbot certonly --manual --preferred-challenges dns -d *.example.com -d example.comВам предложат добавить TXT-запись в DNS-зону. После подтверждения вы получите сертификат.
Автоматизация Wildcard возможна через плагины для DNS-провайдеров (например, certbot-dns-cloudflare, certbot-dns-digitalocean).
6.5 Использование самоподписанного сертификата (для тестирования)
Для разработки или внутренних нужд можно создать самоподписанный сертификат:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/ssl/private/selfsigned.key \
-out /etc/ssl/certs/selfsigned.crt \
-subj "/CN=example.com"Браузер будет показывать предупреждение (небезопасно), поэтому такой сертификат нельзя использовать в продакшене.
7. Распространённые ошибки и их решение
| Ошибка | Причина | Решение |
|---|---|---|
| «SSL certificate error» | Сертификат не соответствует домену | Проверьте CN/SAN и server_name |
| «Certificate expired» | Истёк срок действия | Обновите сертификат |
| «Chain issues» | Нет промежуточных сертификатов | Используйте fullchain.pem |
| «Port 443 not open» | SSL-порт закрыт фаерволом | Откройте порт 443 |
| «Mixed content» | На странице есть ссылки на HTTP-ресурсы | Замените все URL на HTTPS |
| «Too many redirects» | Циклическое перенаправление | Проверьте конфигурацию редиректов |
| «ssl_error: no alternative certificate» | Несовпадение server_name и SAN | Добавьте все домены в server_name и при выпуске сертификата |
8. Заключение
Мы подробно разобрали установку и настройку SSL-сертификатов для Nginx и Apache:
- Узнали, что такое SSL/TLS и какие бывают типы сертификатов.
- Настроили бесплатные сертификаты Let’s Encrypt с автоматическим обновлением.
- Написали полные конфигурации для Nginx и Apache с HTTPS.
- Настроили перенаправление HTTP → HTTPS и добавили продвинутые заголовки (HSTS).
- Рассмотрели ручную установку платных сертификатов и Wildcard.
Теперь ваш сервер полностью защищён, данные шифруются, а пользователи видят заветный зелёный замок в браузере. Это не только безопасность, но и доверие со стороны посетителей, а также улучшение позиций в поисковой выдаче (Google учитывает HTTPS как фактор ранжирования).
Вы можете воспользоваться нашим генератором, который по введённым данным выдаёт готовый блок конфига для Nginx или Apache: пути к сертификатам, шифры, HSTS, OCSP, редирект, заголовки безопасности.
