Вопрос или проблема
У меня есть несколько виртуальных хостов, обслуживающих сайты на apache. У каждого сайта есть свой собственный файл конфигурации, и многие имеют установленный SSL-сертификат.
Файл 00_default.conf <VirtualHost *:80>
указывает на статическую страницу типа 404.
Это всё работает хорошо…
Моя проблема в том, что если вы посещаете сайт в режиме https, у которого не настроен SSL или нет файла конфигурации, он по умолчанию использует SSL-сертификат из первого файла конфигурации, который он находит и который содержит <VirtualHost *:443>
.
Я предполагаю, что мне нужно создать правило в 00_default.conf, чтобы обрабатывать запросы на страницы, которых не существует при запросе через HTTPS. Пока я не нашел конфигурацию, которая работает.
Есть две вещи:
- вы всегда получите предупреждение/ошибку в браузере, когда подключаетесь с HTTPS к веб-сайту на веб-сервере, который не предоставляет действительный TLS-сертификат, который включает имя веб-сайта, введенное в URL. Назначение другого виртуального хоста для обработки этих запросов не изменит этой основной истины.
- Назначение конкретного виртуального хоста в качестве стандартного HTTPS виртуального хоста лишь изменит, какой (несоответствующий) TLS-сертификат будет представлен и какой веб-контент будет показан.
Лучший способ правильно решить эту проблему — настроить HTTPS для всех веб-сайтов, которые вы хостите на своем веб-сервере.
В отсутствие этого: вероятно, проще всего добавить запись HTTPS VirtualHost в ваш существующий 00_default.conf
, в результате чего получится что-то вроде:
<VirtualHost _default_:80>
ServerName www.example.com
ServerAlias example.com
DocumentRoot /var/www/html/www.example.com/
</VirtualHost>
<VirtualHost _default_:443>
ServerName www.example.com
ServerAlias example.com
DocumentRoot /var/www/html/www.example.com/
SSLEngine on
SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLHonorCipherOrder On
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
SSLCompression off
SSLUseStapling on
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLCertificateFile /etc/letsencrypt/live/www.example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.example.com/privkey.pem
SSLCACertificateFile /etc/letsencrypt/live/www.example.com/chain.pem
</VirtualHost>
Ответ или решение
Правильная конфигурация SSL для Apache
Если у вас есть несколько виртуальных хостов, работающих на Apache, некоторые из которых уже настроены с SSL сертификатами, важно правильно организовать конфигурацию, чтобы избежать возможных проблем с безопасностью и пользовательским опытом. Ниже мы рассматриваем правильные настройки SSL для вашего веб-сервера Apache, особенно когда речь идет о конфигурации по умолчанию.
Проблема
Когда пользователи пытаются получить доступ к сайтам по HTTPS, которые не имеют корректной SSL конфигурации или не имеют соответствующего файла конфигурации, Apache использует первый сертификат, найденный в конфигурации. Это может привести к предупреждениям браузера о несуществующих или недействительных сертификатах, что негативно сказывается на доверии пользователей.
Решение
Лучший способ решить проблему — обеспечить наличие корректной SSL настройки для каждого сайта. Однако если это невозможно, вы можете настроить виртуальный хост по умолчанию для обработки таких запросов. В этом случае вы можете создать новый запись <VirtualHost>
для HTTPS в файле 00_default.conf
, обеспечивая безопасный и корректный ответ для недоступных сайтов.
Вот пример конфигурации, которая может быть добавлена в ваш файл:
<VirtualHost _default_:80>
DocumentRoot /var/www/html
ServerName example.com
Redirect permanent / https://example.com/
</VirtualHost>
<VirtualHost _default_:443>
DocumentRoot /var/www/html
ServerName example.com
SSLEngine on
SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLHonorCipherOrder On
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
SSLCompression off
SSLUseStapling on
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
SSLCACertificateFile /etc/letsencrypt/live/example.com/chain.pem
# Выдача 404 для недоступных сайтов
ErrorDocument 404 /404.html
</VirtualHost>
Разбор конфигурации
-
Переадресация с HTTP на HTTPS: В первом виртуальном хосте по умолчанию мы перенаправляем все запросы с
http://
наhttps://
для доменаexample.com
. Это гарантирует, что пользователи автоматически будут использованы безопасный протокол. -
Настройки TLS/SSL: В
<VirtualHost _default_:443>
вы настраиваете протоколы и шифры для безопасности. Исключены устаревшие и ненадежные версии протокола SSL и TLS, что минимизирует риски атак. -
Заголовки безопасности: Использование заголовков, таких как
Strict-Transport-Security
,X-Frame-Options
, иX-Content-Type-Options
, улучшает безопасность и защищает от различных угроз. -
Обработка ошибок: Конфигурация включает обработку 404 ошибок, что позволяет пользователю видеть страницу с уведомлением, если запрашиваемый сайт отсутствует.
Заключение
Хотя наилучшее решение — это обладать SSL сертификатом для каждого вашего сайта, предложенные изменения помогут вам управлять ситуацией, когда сайт не доступен по HTTPS. Правильная конфигурация SSL не только улучшает безопасность вашего веб-сервера, но и защищает вашего пользователя от возможных угроз. Не забывайте регулярно обновлять свои сертификаты и поддерживать актуальность конфигурации.