Ручная установка SSL-сертификата на Nginx и Apache: пошаговое руководство 2026 | AdminWiki
Timeweb Cloud — сервера, Kubernetes, S3, Terraform. Лучшие цены IaaS.
Попробовать

Ручная установка SSL-сертификата на Nginx и Apache: пошаговое руководство 2026

06 апреля 2026 10 мин. чтения
Содержание статьи

Внедрение HTTPS — обязательный этап для любого публичного сайта и критически важный для внутренних сервисов. Автоматические инструменты вроде Certbot упрощают процесс, но понимание ручной установки SSL/TLS-сертификата — ключевой навык для системного администратора и DevOps инженера. Оно позволяет гибко управлять сертификатами от любых центров сертификации (ЦС), корректно настраивать безопасность в нестандартных окружениях и оперативно диагностировать проблемы.

Эта инструкция предоставляет полный, проверенный на практике алгоритм действий для 2026 года. Вы получите готовые к использованию, безопасные конфигурации virtual hosts для Nginx и Apache, научитесь настраивать современные протоколы TLS, шифры и HSTS, а также освоите процедуру верификации развертывания с помощью SSL Labs.

Подготовка: выбор сертификата и структура файлов

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

Коммерческий, Let's Encrypt или самоподписанный: что выбрать в 2026 году?

Выбор зависит от сценария использования, требований к доверию и бюджета. Используйте эту таблицу для принятия взвешенного решения.

Тип сертификата Доверие в браузерах Срок действия Стоимость Идеальный сценарий использования
Коммерческий (DigiCert, Sectigo и др.) Полное, глобальное 1-2 года Платная Корпоративные B2B-сайты, интернет-магазины, финансовые сервисы, где важен максимум доверия и часто требуется расширенная проверка (EV).
Let's Encrypt Полное, глобальное 90 дней Бесплатно Подавляющее большинство публичных сайтов, блогов, API. Требует настройки автоматического обновления (например, через Certbot или ACME-клиенты).
Самоподписанный (self-signed) Отсутствует (требует ручного доверия) Любой (задается при создании) Бесплатно Внутренняя инфраструктура: тестовые стенды, среды разработки, приватные API, панели управления серверами (например, TrueNAS), сервисы в изолированных сетях (Kubernetes без Ingress).

Ключевое правило: Для любого сервиса, доступного из публичного интернета (особенно для B2B), используйте только сертификаты от доверенных ЦС (коммерческих или Let's Encrypt). Самоподписанные сертификаты вызовут предупреждения безопасности в браузерах клиентов, что неприемлемо.

Где что лежит: правильная структура файлов и каталогов

Единая и безопасная структура хранения — основа безошибочной конфигурации. Следуйте этим рекомендациям для Linux-систем.

Рекомендуемая структура каталогов:

/etc/ssl/
├── private/          # Приватные ключи (.key). Должен иметь строгие права.
│   └── example.com.key
├── certs/            # Публичные сертификаты (.crt, .pem) и цепочки доверия.
│   ├── example.com.crt
│   └── example.com.chain.crt
└── dhparam.pem       # Параметры Диффи-Хеллмана (опционально, для Nginx).

Критически важные шаги после размещения файлов:

  1. Права доступа к приватному ключу: Ключ должен быть доступен только для чтения владельцу (обычно root или пользователю, под которым работает веб-сервер).
    sudo chmod 600 /etc/ssl/private/example.com.key
    sudo chown root:root /etc/ssl/private/example.com.key
  2. Цепочка доверия (Intermediate Certificate): Коммерческие ЦС и Let's Encrypt почти всегда выдают сертификат сайта и один или несколько промежуточных сертификатов. Для корректной работы браузеров вы обязаны объединить их в правильном порядке. Обычно ЦС предоставляет файл «CA-Bundle» или «Chain». В конфигурации веб-сервера нужно указать путь к этому файлу отдельной директивой (ssl_trusted_certificate в Nginx, SSLCertificateChainFile в Apache).

Проверьте совместимость версий вашего ПО: для актуальных настроек безопасности 2026 года требуются Nginx >= 1.19.4, Apache >= 2.4.47 и OpenSSL >= 1.1.1.

Настройка Nginx: готовые и безопасные конфигурации virtual host

Конфигурация Nginx для HTTPS должна решать три задачи: обеспечить безопасное соединение, перенаправить весь трафик с HTTP и оптимизировать производительность. Приведенный ниже блок — готовый шаблон, протестированный в production-среде.

Базовый HTTPS virtual host: от A до Z

Создайте или отредактируйте файл конфигурации сайта, например, /etc/nginx/sites-available/example.com. Основной блок для порта 443:

server {
    # Слушаем порт 443 для HTTPS с поддержкой HTTP/2
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name example.com www.example.com;

    # Указываем корневую директорию сайта
    root /var/www/example.com/html;
    index index.html index.htm;

    # --- КРИТИЧЕСКИ ВАЖНО: ПУТИ К ФАЙЛАМ СЕРТИФИКАТА ---
    # Полный путь к основному сертификату сайта
    ssl_certificate /etc/ssl/certs/example.com.crt;
    # Полный путь к приватному ключу
    ssl_certificate_key /etc/ssl/private/example.com.key;
    # Путь к цепочке доверия (intermediate certificates).
    # Если ваш .crt файл уже содержит цепочку, эту строку можно опустить.
    ssl_trusted_certificate /etc/ssl/certs/example.com.chain.crt;

    # --- ОСНОВНЫЕ НАСТРОЙКИ БЕЗОПАСНОСТИ ---
    # Разрешаем только современные протоколы. TLS 1.0 и 1.1 уязвимы.
    ssl_protocols TLSv1.2 TLSv1.3;
    # Отключаем устаревшие и небезопасные SSL-шифры
    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 on;

    # Включаем HSTS (Strict-Transport-Security)
    # Браузер будет подключаться только по HTTPS в течение 31536000 секунд (1 год)
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    # Стандартная директива для обработки запросов
    location / {
        try_files $uri $uri/ =404;
    }

    # Дополнительно: запрещаем индексацию служебных файлов
    location ~ /\.ht {
        deny all;
    }
}

Обязательный редирект с HTTP (порт 80) на HTTPS: Создайте отдельный блок server для порта 80 в том же или отдельном файле.

server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    # Постоянный редирект (301) на HTTPS-версию того же хоста
    return 301 https://$server_name$request_uri;
}

После внесения изменений всегда проверяйте синтаксис: sudo nginx -t. Если проверка прошла успешно, примените конфигурацию: sudo systemctl reload nginx.

Критически важные настройки безопасности: протоколы, шифры, HSTS

Простого включения SSL недостаточно. Неправильные настройки могут оставить ваш сайт уязвимым.

  • ssl_protocols: Директива TLSv1.2 TLSv1.3 отключает устаревшие и небезопасные TLS 1.0, 1.1 и все версии SSL. TLS 1.3 обеспечивает лучшую производительность и безопасность «из коробки».
  • ssl_ciphers: Приведенный набор шифров (cipher suites) обеспечивает Forward Secrecy (PFS) за счет использования ECDHE (Elliptic Curve Diffie-Hellman Ephemeral). Это означает, что даже если злоумышленник получит приватный ключ сервера в будущем, он не сможет расшифровать ранее перехваченный трафик. Это обязательное требование для получения оценки A+ в SSL Labs.
  • HSTS (HTTP Strict Transport Security): Заголовок Strict-Transport-Security приказывает браузеру всегда подключаться к вашему сайту по HTTPS, даже если пользователь введет http://. Это защищает от атак downgrade (например, SSL stripping). Параметр includeSubDomains распространяет правило на все поддомены. Включайте HSTS только после полной и успешной проверки работы HTTPS на всех поддоменах. Флаг preload используется для включения сайта в предустановленные списки HSTS в браузерах и требует отдельной регистрации.

Для более глубокого погружения в архитектуру конфигураций Nginx, включая работу с секциями http и server, изучите полное руководство по структуре nginx.conf.

Дополнительная оптимизация: OCSP stapling и кеширование сессий

Эти настройки снижают нагрузку на клиентов и ускоряют установление повторных соединений.

# В блоке http {} (обычно в nginx.conf) или в конкретном server {}
ssl_session_cache shared:SSL:10m;  # Кеш сессий на 10 мегабайт
ssl_session_timeout 1d;           # Время жизни сессии — 1 день

# Включаем OCSP Stapling для проверки статуса отзыва сертификата
ssl_stapling on;
ssl_stapling_verify on;
# Для проверки stapling требуется указать резолвер
resolver 8.8.8.8 1.1.1.1 valid=300s;
resolver_timeout 5s;

OCSP Stapling позволяет серверу самому получать от ЦС подтверждение, что сертификат не отозван, и передавать его клиенту вместе с сертификатом. Это избавляет клиента от необходимости делать отдельный запрос к ЦС, что повышает конфиденциальность и скорость загрузки страницы.

Настройка Apache: детальная конфигурация для httpd и virtual hosts

Настройка HTTPS в Apache имеет свою специфику, связанную с модульной архитектурой и синтаксисом директив.

VirtualHost для HTTPS: полный пример конфигурации

Убедитесь, что модуль mod_ssl активен (sudo a2enmod ssl на Debian/Ubuntu). Конфигурация для порта 443 размещается в файле виртуального хоста (например, /etc/apache2/sites-available/example.com-ssl.conf).

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

    # Включаем SSL/TLS для этого виртуального хоста
    SSLEngine on

    # --- ПУТИ К ФАЙЛАМ СЕРТИФИКАТА ---
    # Файл сертификата сайта (публичный ключ)
    SSLCertificateFile /etc/ssl/certs/example.com.crt
    # Файл приватного ключа
    SSLCertificateKeyFile /etc/ssl/private/example.com.key
    # ФАЙЛ ЦЕПОЧКИ ДОВЕРИЯ. Критически важная директива.
    SSLCertificateChainFile /etc/ssl/certs/example.com.chain.crt

    # --- НАСТРОЙКИ БЕЗОПАСНОСТИ ---
    # Разрешаем только TLS 1.2 и 1.3
    SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
    # Набор безопасных шифров, аналогичный Nginx
    SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384
    # Приоритет шифров сервера
    SSLHonorCipherOrder on

    # Включаем HSTS через модуль mod_headers
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"

    # Стандартные директивы для обработки запросов
    <Directory /var/www/example.com/html>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/example.com-ssl_error.log
    CustomLog ${APACHE_LOG_DIR}/example.com-ssl_access.log combined
</VirtualHost>

Особенности безопасности Apache: модули и директивы

Помимо mod_ssl, для полной настройки безопасности часто требуется mod_headers (для HSTS). Проверьте их наличие: apachectl -M | grep -E 'ssl|headers'.

Директива SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 — это стандартный способ в Apache разрешить все протоколы, а затем явно отключить устаревшие. Убедитесь, что в конфигурации не осталось ссылок на уязвимые модули вроде mod_heartbleed (исторический пример).

Редирект HTTP -> HTTPS в Apache: Создайте или измените конфиг для порта 80.

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

Проверьте синтаксис: sudo apachectl configtest. Примените изменения: sudo systemctl reload apache2 (или httpd).

Проверка и диагностика: убеждаемся, что всё работает и безопасно

После настройки обязательна многоуровневая проверка. Пропуск этого этапа может оставить на сайте критические уязвимости.

Локальные команды для быстрой проверки

  1. Проверка статуса службы и логов:
    sudo systemctl status nginx или sudo systemctl status apache2
    Проверьте логи на наличие ошибок SSL:
    sudo tail -f /var/log/nginx/error.log
    sudo tail -f /var/log/apache2/error.log
  2. Проверка подключения и сертификата:
    openssl s_client -connect example.com:443 -servername example.com
    В выводе ищите строку «Verify return code: 0 (ok)». Если код не 0, есть проблема с цепочкой доверия.
  3. Проверка OCSP Stapling:
    openssl s_client -connect example.com:443 -servername example.com -status
    В ответе должна быть секция «OCSP Response Data» с статусом «good».
  4. Проверка заголовков (включая HSTS):
    curl -I https://example.com
    Убедитесь, что в ответе присутствует заголовок Strict-Transport-Security.

Анализ отчета SSL Labs: на что смотреть в 2026 году

Сервис Qualys SSL Labs (SSL Server Test) — отраслевой стандарт для внешней проверки. Введите адрес вашего сайта и дождитесь отчета.

Ключевые пункты для оценки A+ в 2026 году:

  • Overall Rating: Цель — A+. Оценка A или ниже указывает на наличие уязвимостей или устаревших настроек.
  • Certificate: Должен быть «Trusted» и иметь корректную цепочку. «Extra download» может означать проблему с отдачей промежуточных сертификатов.
  • Protocol Support: Должны быть включены только TLS 1.2 и TLS 1.3. TLS 1.0, 1.1 и любые версии SSL должны быть отключены (красные крестики).
  • Cipher Strength: Все поддерживаемые шифры должны обеспечивать Forward Secrecy. В отчете будет отдельный пункт «This server supports Forward Secrecy».
  • Handshake Simulation: Убедитесь, что современные браузеры и ОС (Chrome, Firefox, Windows 10/11) могут успешно подключиться по TLS 1.2 или 1.3.
  • HSTS (Strict Transport Security): В отчете будет указано, включен ли заголовок и его параметры (max-age, includeSubDomains).

Если оценка ниже A+, отчет детально укажет на проблемные места («Issues»). Чаще всего это устаревшие протоколы, слабые шифры или отсутствие цепочки доверия.

Решение частых проблем и ошибок

Даже при точном следовании инструкции могут возникнуть проблемы. Вот краткий справочник по самым частым из них.

Ошибки безопасности и недоверенные сертификаты

  • «NET::ERR_CERT_AUTHORITY_INVALID» или «SSL_ERROR_BAD_CERT_DOMAIN» в браузере.
    Причина: Неправильно указана или отсутствует цепочка доверия (intermediate certificate).
    Решение: Убедитесь, что директива ssl_trusted_certificate (Nginx) или SSLCertificateChainFile (Apache) ведет к правильному файлу, содержащему промежуточные сертификаты в правильном порядке (сначала сертификат сайта, затем промежуточные, но обычно в отдельном файле). Проверьте с помощью команды openssl s_client -connect.
  • Самоподписанный сертификат не доверен для внутреннего сервиса.
    Решение: Для Linux-клиентов добавьте корневой CA-сертификат (которым вы подписывали) в системное хранилище доверия (/usr/local/share/ca-certificates/ и update-ca-certificates). Для Windows — импортируйте .crt файл в «Доверенные корневые центры сертификации».

Проблемы производительности и доступности сайта

  • Сайт не загружается по HTTPS, но по HTTP работает. В логах ошибки SSL.
    Причина 1: Неправильные права доступа к файлу приватного ключа.
    Решение: Выполните chmod 600 /path/to/key и убедитесь, что владелец правильный.
    Причина 2: Брандмауэр блокирует порт 443.
    Решение: Откройте порт: sudo ufw allow 443/tcp (для UFW) или настройте соответствующие правила iptables/nftables.
  • «ERR_SSL_VERSION_OR_CIPHER_MISMATCH» в браузере.
    Причина: Клиент (например, старый Android, IE) пытается использовать отключенный на сервере протокол (TLS 1.0) или шифр.
    Решение: Если поддержка старых клиентов не требуется — игнорируйте, это ожидаемое поведение при правильной безопасности. Если требуется — пересмотрите настройки ssl_protocols и ssl_ciphers, но осознавайте связанные с этим риски. Всегда проверяйте поддержку в SSL Labs.
  • Веб-сервер (Nginx/Apache) не запускается после изменения конфига.
    Решение: Всегда используйте команды проверки синтаксиса перед перезагрузкой: nginx -t или apachectl configtest. Они точно укажут на строку с ошибкой (чаще всего опечатка, отсутствующая точка с запятой или неправильный путь).

Для сложных сценариев, таких как настройка HTTPS за reverse proxy или балансировщиком нагрузки, изучите специализированное руководство по настройке Nginx Reverse Proxy, где подробно разбирается SSL Termination и передача заголовков.

Поделиться:
Сохранить гайд? В закладки браузера