Все руководства по развёртыванию Развёртывание

Как установить SSL-сертификат на Apache

Это руководство проведёт вас через установку SSL-сертификата на Apache HTTP Server с использованием mod_ssl — от загрузки файлов до усиленных настроек TLS и устранения распространённых ошибок. Подходит для сертификатов от GetHTTPS, Certbot или любого удостоверяющего центра (CA).

Если у вас ещё нет сертификата, получите его бесплатно за 5 минут.

Предварительные требования

  • Apache 2.4+ установлен и обслуживает ваш сайт по HTTP (порт 80)
  • Root/sudo-доступ к серверу
  • Файлы сертификата — Apache требует три отдельных файла:

Почему три файла? В отличие от Nginx (который использует один fullchain.pem), Apache традиционно ожидает сертификат и цепочку в отдельных файлах. Apache 2.4.8+ может использовать fullchain.pem в SSLCertificateFile и пропустить SSLCertificateChainFile. Подробнее о форматах →

Шаг 1: Загрузите файлы сертификата

# Создайте защищённую директорию
sudo mkdir -p /etc/ssl/gethttps

# Скопируйте файлы на сервер
sudo cp cert.pem chain.pem privkey.pem /etc/ssl/gethttps/

# Ограничьте доступ к закрытому ключу
sudo chmod 600 /etc/ssl/gethttps/privkey.pem
sudo chmod 644 /etc/ssl/gethttps/cert.pem /etc/ssl/gethttps/chain.pem
sudo chown root:root /etc/ssl/gethttps/*

При передаче через SCP:

scp cert.pem chain.pem privkey.pem user@your-server:/tmp/
# На сервере:
sudo mv /tmp/{cert,chain,privkey}.pem /etc/ssl/gethttps/

Шаг 2: Включите необходимые модули Apache

# Debian/Ubuntu
sudo a2enmod ssl        # Основной SSL-модуль
sudo a2enmod headers    # Для HSTS и заголовков безопасности
sudo a2enmod rewrite    # Для редиректа HTTP→HTTPS (при использовании .htaccess)
sudo systemctl restart apache2

# CentOS/RHEL/Amazon Linux
sudo yum install mod_ssl    # Обычно устанавливает и включает за один шаг
sudo systemctl restart httpd

Убедитесь, что mod_ssl загружен:

apachectl -M | grep ssl
# Ожидаемый результат: ssl_module (shared)

Шаг 3: Настройте HTTPS VirtualHost

Создайте или отредактируйте SSL-конфигурацию вашего сайта. В Debian/Ubuntu это обычно /etc/apache2/sites-available/yourdomain-ssl.conf:

# ─── HTTPS-сервер ────────────────────────────
<VirtualHost *:443>
    ServerName example.com
    ServerAlias www.example.com

    # Файлы сертификата
    SSLEngine on
    SSLCertificateFile      /etc/ssl/gethttps/cert.pem
    SSLCertificateKeyFile   /etc/ssl/gethttps/privkey.pem
    SSLCertificateChainFile /etc/ssl/gethttps/chain.pem

    # Протокол TLS — только 1.2 и 1.3
    SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
    SSLHonorCipherOrder off
    SSLCompression off

    # OCSP stapling (ускоряет проверку сертификата для клиентов)
    SSLUseStapling on
    SSLStaplingCache "shmcb:/var/run/apache2/ssl_stapling(128000)"

    # Заголовки безопасности
    Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"
    Header always set X-Content-Type-Options "nosniff"
    Header always set X-Frame-Options "SAMEORIGIN"

    # Ваш сайт
    DocumentRoot /var/www/html
    <Directory /var/www/html>
        AllowOverride All
    </Directory>
</VirtualHost>

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

Что делает каждая директива:

ДирективаНазначение
SSLEngine onВключает SSL/TLS для данного VirtualHost
SSLCertificateFileПуть к вашему сертификату
SSLCertificateKeyFileПуть к вашему закрытому ключу
SSLCertificateChainFileПуть к промежуточному сертификату CA
SSLProtocolТолько TLS 1.2/1.3 — старые версии устарели
SSLHonorCipherOrder offПозволяет клиенту выбрать лучший шифр
SSLCompression offПредотвращает атаку CRIME
SSLUseStaplingСервер заранее получает OCSP-ответ
Strict-Transport-SecurityHSTS — браузеры запоминают, что нужно всегда использовать HTTPS
Redirect permanent301-редирект HTTP → HTTPS

Шаг 4: Включите сайт и проверьте

# Debian/Ubuntu
sudo a2ensite yourdomain-ssl.conf
sudo apachectl configtest          # Должно показать "Syntax OK"
sudo systemctl reload apache2

# CentOS/RHEL
sudo apachectl configtest
sudo systemctl reload httpd

Если configtest сообщает об ошибке, он указывает точную строку — исправьте её перед перезагрузкой.

Шаг 5: Проверка

Браузер: Перейдите на https://yourdomain.com. Нажмите на замочек → убедитесь, что издатель — “Let’s Encrypt”.

Командная строка:

echo | openssl s_client -connect yourdomain.com:443 -servername yourdomain.com 2>/dev/null \
  | openssl x509 -noout -subject -issuer -dates

Онлайн: Используйте SSL Labs Server Test для комплексной оценки. Цель: A или A+.

Apache vs Nginx: различия в файлах сертификатов

ApacheNginx
СертификатSSLCertificateFile cert.pemssl_certificate fullchain.pem
Закрытый ключSSLCertificateKeyFile privkey.pemssl_certificate_key privkey.pem
ЦепочкаSSLCertificateChainFile chain.pemВключена в fullchain.pem
Необходимо файлов3 отдельных файла2 файла (цепочка объединена)

Apache 2.4.8+ также может использовать объединённый fullchain.pem в SSLCertificateFile — тогда можно не указывать SSLCertificateChainFile.

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

Когда срок действия вашего сертификата подходит к концу (проверьте здесь):

# Замените файлы
sudo cp new-cert.pem /etc/ssl/gethttps/cert.pem
sudo cp new-chain.pem /etc/ssl/gethttps/chain.pem
sudo cp new-privkey.pem /etc/ssl/gethttps/privkey.pem

# Перезагрузите (не перезапустите) — без простоя
sudo systemctl reload apache2    # Debian/Ubuntu
sudo systemctl reload httpd      # CentOS/RHEL

Полное руководство по обновлению → | Автоматизация с Certbot →

Устранение неполадок

”AH02572: Failed to configure certificate” / несовпадение ключа

Сертификат и закрытый ключ не соответствуют друг другу. Проверьте совпадение:

# Эти два хеша должны быть идентичны
openssl x509 -noout -modulus -in /etc/ssl/gethttps/cert.pem | md5sum
openssl rsa -noout -modulus -in /etc/ssl/gethttps/privkey.pem | md5sum

Если они различаются, вы используете файлы из разных сессий GetHTTPS. Скачайте оба файла заново из одной сессии.

”AH01909: server certificate does NOT include an ID”

Ваш ServerName не совпадает ни с одним доменом в поле SAN сертификата:

openssl x509 -noout -text -in /etc/ssl/gethttps/cert.pem | grep -A1 "Subject Alternative Name"

Убедитесь, что ServerName в Apache точно совпадает с одним из указанных DNS-имён.

Браузер показывает «сертификат не является доверенным»

Отсутствует промежуточная цепочка. Убедитесь, что SSLCertificateChainFile указывает на chain.pem (промежуточный сертификат), а не на cert.pem. Проверьте цепочку:

echo | openssl s_client -connect yourdomain.com:443 2>/dev/null | grep "Verify return code"
# "Verify return code: 0 (ok)" = хорошо
# "Verify return code: 21 (unable to verify)" = цепочка неполная

“AH00526: Syntax error on line X”

Синтаксическая ошибка в конфигурации Apache. Частые причины:

  • Отсутствует закрывающий тег </VirtualHost>
  • Опечатка в SSLCertificateChainFile
  • Отсутствуют кавычки вокруг значений заголовков
  • Указанный путь к файлу не существует

HTTPS работает, но отображается «Не защищено»

Смешанный контент — ваша страница загружает ресурсы по HTTP. Откройте DevTools → Console → исправьте URL-адреса с http://.

Часто задаваемые вопросы

Можно ли использовать fullchain.pem вместо отдельных файлов cert + chain?

Да, на Apache 2.4.8+. Используйте SSLCertificateFile /path/to/fullchain.pem и полностью удалите директиву SSLCertificateChainFile. На более старых версиях Apache необходимы отдельные файлы.

Как узнать, какая версия Apache установлена?

apachectl -v
# или
httpd -v

Нужно ли перезапускать Apache или достаточно перезагрузить?

Перезагрузки (systemctl reload) достаточно, и она не вызывает простоя. Перезапуск (systemctl restart) разрывает все активные соединения. Для замены сертификатов всегда используйте reload.

Может ли Apache обслуживать разные сертификаты для разных доменов?

Да. Создайте отдельные блоки <VirtualHost *:443> с разными ServerName и директивами SSLCertificate*. Apache использует SNI (Server Name Indication) для выбора правильного сертификата.

Поддерживает ли Apache сертификаты ECDSA?

Да. Apache 2.4+ работает с ECDSA так же, как с RSA — те же директивы, тот же формат файлов. GetHTTPS по умолчанию генерирует ECDSA P-256.

Где находятся логи SSL-ошибок Apache?

# Debian/Ubuntu
tail -f /var/log/apache2/error.log

# CentOS/RHEL
tail -f /var/log/httpd/ssl_error_log

Похожие статьи

Начало работы 2026-05-08
Как получить бесплатный SSL-сертификат (пошаговое руководство)
Получите бесплатный SSL-сертификат от Let's Encrypt за 5 минут --- без установки программ, без создания аккаунта. Полное руководство: 4 метода, оба типа проверки, установка на 6 платформах и устранение неполадок.
Развёртывание 2026-05-07
Как перенаправить HTTP на HTTPS
Принудительное перенаправление всего трафика на HTTPS с помощью серверных редиректов. Примеры конфигурации для Nginx, Apache и .htaccess с постоянными перенаправлениями 301.
Развёртывание 2026-05-08
Как установить SSL-сертификат на Nginx
Пошаговое руководство по установке SSL-сертификата на Nginx. Охватывает загрузку файлов, полную конфигурацию серверного блока, лучшие практики TLS, HTTP/2, HSTS, настройку редиректов, тестирование и устранение 6 распространённых ошибок.
Развёртывание 2026-05-07
Как исправить предупреждения о смешанном контенте
Смешанный контент возникает, когда HTTPS-страница загружает ресурсы по HTTP. Узнайте, как найти и исправить ошибки смешанного контента, чтобы получить чистый значок замка.
Получите бесплатный SSL-сертификат в браузере
Без установки, без аккаунта. Ваш приватный ключ никогда не покидает устройство.
Получить сертификат