Это руководство проведёт вас через установку SSL-сертификата на Apache HTTP Server с использованием mod_ssl — от загрузки файлов до усиленных настроек TLS и устранения распространённых ошибок. Подходит для сертификатов от GetHTTPS, Certbot или любого удостоверяющего центра (CA).
Если у вас ещё нет сертификата, получите его бесплатно за 5 минут.
Предварительные требования
- Apache 2.4+ установлен и обслуживает ваш сайт по HTTP (порт 80)
- Root/sudo-доступ к серверу
- Файлы сертификата — Apache требует три отдельных файла:
cert.pem— ваш сертификат (только конечный)privkey.pem— ваш закрытый ключchain.pem— промежуточная цепочка сертификатов CA
Почему три файла? В отличие от 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-Security | HSTS — браузеры запоминают, что нужно всегда использовать HTTPS |
Redirect permanent | 301-редирект 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: различия в файлах сертификатов
| Apache | Nginx | |
|---|---|---|
| Сертификат | SSLCertificateFile cert.pem | ssl_certificate fullchain.pem |
| Закрытый ключ | SSLCertificateKeyFile privkey.pem | ssl_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