Руководство по установке и настройке SSL-сертификатов

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

  1. Браузер подключается к серверу по HTTPS.
  2. Сервер отправляет свой сертификат (публичный ключ, подписанный доверенным центром).
  3. Браузер проверяет сертификат (не истёк ли срок, подписан ли доверенным центром, соответствует ли домену).
  4. Если проверка пройдена, клиент и сервер договариваются о сеансовом ключе шифрования (рукопожатие).
  5. Все дальнейшие данные шифруются с помощью этого ключа.

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:

Bash
sudo apt update
sudo apt install certbot python3-certbot-nginx   # для Nginx
# или
sudo apt install certbot python3-certbot-apache  # для Apache

Установка на CentOS/RHEL:

Bash
sudo dnf install certbot python3-certbot-nginx   # для Nginx
# или
sudo dnf install certbot python3-certbot-apache  # для Apache

2.2 Получение сертификата

С автоматической настройкой веб-сервера (Nginx):

Bash
sudo certbot --nginx -d example.com -d www.example.com

С автоматической настройкой веб-сервера (Apache):

Bash
sudo certbot --apache -d example.com -d www.example.com

С ручной настройкой (без изменения конфигурации сервера):

Bash
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-таймер автоматически.

Проверка статуса обновления:

Bash
sudo systemctl status certbot.timer   # на systemd
sudo crontab -l                       # если добавлено в cron

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

Bash
sudo certbot renew

Принудительное обновление даже для неистекших:

Bash
sudo certbot renew --force-renewal

2.5 Настройка веб-сервера после получения сертификата

Если вы использовали автоматическую настройку (certbot --nginx или --apache), конфигурация будет изменена автоматически. В противном случае нужно настроить вручную.

3. Настройка SSL в Nginx

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

Nginx
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:

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

Или с сохранением оригинального хоста:

Nginx
server {
    listen 80;
    listen [::]:80;
    server_name _;
    return 301 https://$host$request_uri;
}

3.3 Поддержка нескольких доменов (SAN)

Если сертификат выдан для нескольких доменов, их все нужно указать в server_name:

Nginx
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:

Nginx
listen 443 ssl http2;

3.5 Проверка конфигурации и перезагрузка

Bash
nginx -t
sudo systemctl reload nginx

4. Настройка SSL в Apache

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

Включите модуль SSL:

Bash
sudo a2enmod ssl
sudo systemctl restart apache2

Конфигурация виртуального хоста для HTTPS:

Apache
<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:

Apache
<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com
    Redirect permanent / https://example.com/
</VirtualHost>

4.3 Проверка конфигурации и перезагрузка

Bash
sudo apachectl configtest
sudo systemctl reload apache2

5. Ручная установка платного SSL-сертификата

Если вы приобрели платный сертификат (например, от Comodo, DigiCert, Sectigo), его обычно присылают в виде файлов:

  • your_domain.crt — ваш сертификат.
  • ca_bundle.crt или intermediate.crt — цепочка промежуточных сертификатов.
  • private.key — приватный ключ.

Шаги:

  1. Объедините сертификаты в один файл (если требуется):
Bash
cat your_domain.crt ca_bundle.crt > fullchain.pem

2. Скопируйте файлы в защищённую директорию:

Bash
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. В конфигурации веб-сервера укажите пути к этим файлам (как в примерах выше).
  2. Не забудьте настроить автоматическое обновление (платные сертификаты часто выдаются на 1 год, так что нужно будет заменять вручную или через скрипты).

6. Продвинутые темы

6.1 HSTS (HTTP Strict Transport Security)

HSTS заставляет браузер всегда использовать HTTPS, даже если пользователь вводит HTTP. Это защищает от атак типа «человек посередине» и снижения протокола.

Осторожно с preload: попадание в preload-список браузеров практически необратимо. Добавляйте preload только если уверены, что все ваши поддомены (включая будущие) будут работать по HTTPS. Сначала протестируйте без preload, убедитесь, что всё работает, и только потом добавляйте. Для подачи в список зайдите на .

В Nginx:

Nginx
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;

В Apache:

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:
Bash
openssl s_client -connect example.com:443 -tls1_2

6.3 Автоматическое обновление Let’s Encrypt с перезагрузкой сервера

Если сервисы не перезагружаются автоматически после обновления, добавьте в crontab:

Bash
0 0 * * * certbot renew --quiet && systemctl reload nginx
# или
0 0 * * * certbot renew --quiet && systemctl reload apache2

6.4 Сертификат для Wildcard (*.example.com)

Let’s Encrypt поддерживает Wildcard-сертификаты, но их выдача требует подтверждения через DNS (не через webroot).

Получение Wildcard-сертификата:

Bash
sudo certbot certonly --manual --preferred-challenges dns -d *.example.com -d example.com

Вам предложат добавить TXT-запись в DNS-зону. После подтверждения вы получите сертификат.

Автоматизация Wildcard возможна через плагины для DNS-провайдеров (например, certbot-dns-cloudflarecertbot-dns-digitalocean).

6.5 Использование самоподписанного сертификата (для тестирования)

Для разработки или внутренних нужд можно создать самоподписанный сертификат:

Bash
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, редирект, заголовки безопасности.