Поэтому для потомства я пытаюсь настроить свой сервер так, чтобы даже когда кто-то пытается перейти на http: // domain.com:443, они будут правильно перенаправлены на https-версию сайта (https: // domain.com).
При тестировании чего-то вроде http: // domain.com:443 он неправильно перенаправляет на https: // domain.com, вместо этого я получаю страницу 400 Bad Request со следующим содержимым:
Плохой запрос
Ваш браузер отправил запрос, который этот сервер не может понять. Причина: вы говорите по обычному протоколу HTTP с портом сервера с поддержкой SSL. Вместо этого используйте схему HTTPS для доступа к этому URL, пожалуйста.
Сервер Apache / 2.4.18 (Ubuntu) на sub.domain.com Порт 443
Я попытался включить следующие строки в свой 000-default.conf
в <VirtualHost *:80>
:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{SERVER_NAME}/$1 [R,L]
Но это не сработало.
Эта проблема возникает на всех доменах, поддоменах и на самом IP-адресе сервера.
Возможно, это связано с тем, что при пробном запуске letsencrypt возвращается следующее:
Domain: domain.com
Type: connection
Detail: Failed to connect to 123.123.123.123:443 for TLS-SNI-01
challenge
Для каждого домена, указанного в папке с поддержкой сайтов.
TL; TR: вы не можете обслуживать одновременно HTTP и HTTPS на одном и том же порту (443).
Хотя теоретически можно было бы определить на основе первых данных от клиента, отправляет ли клиент HTTP-запрос (т.е. GET ..
или аналогичный) или запускает рукопожатие TLS (\x16\x03...
) большинство веб-серверов этого не делают. Вместо этого они ожидают, что клиент будет вести себя правильно, то есть использовать простой HTTP на одном порту (обычно 80) и HTTPS на другом порту (обычно 443).
Ваш URL-адрес http://example.com:443
заставляет браузер выполнять простой HTTP-запрос на порт 443. Но сервер ожидает там TLS, что означает, что ваш простой HTTP-запрос является неожиданным. Apache, по крайней мере, достаточно хорош, чтобы проверить, поступают ли входящие данные для простого HTTP-запроса в этом случае, чтобы он мог предложить вам более полезное описание:
Причина: вы говорите по обычному протоколу HTTP с портом сервера с поддержкой SSL. Вместо этого используйте схему HTTPS для доступа к этому URL, пожалуйста.
Если вы попробуете такие запросы с другими серверами, они либо закроют соединение без каких-либо ошибок, либо просто зависнут, потому что они все еще надеются получить подтверждение TLS от клиента.
У меня была такая же ошибка, и виновата была то, что моя конфигурация пыталась включить SSL на моем порту, отличном от ssl. Любой адрес веб-сайта, начинающийся с http://
будет направлен через порт 80 (<VirtualHost *:80>
), и этот хост ничего не хочет знать о SSL. Любые сайты, начинающиеся с https://
будет направлен через порт 443 (<VirtualHost *:443>
)
Более прямая проблема заключалась в том, что у меня были следующие данные SSL под моим *:80
host, из-за которого Apache пытался включить SSL для соединения без SSL.
SSLEngine on
SSLCertificateFile /bla.crt
SSLCertificateKeyFile /bla.key
SSLCertificateChainFile /bla.crt
После удаления этих строк из *:80
(и убедившись, что они присутствуют под <VirtualHost *:443>
) Мой сервер снова выскочил.
Итак, вот мои <VirtualHost>
s (все в /etc/apache2/sites-available/http.conf
но может отличаться в зависимости от вашей настройки):
<VirtualHost *:80>
-- snip --
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</VirtualHost>
<VirtualHost *:443>
-- snip --
SSLEngine on
SSLCertificateFile /var/www/ssl/STAR_iconcierge_net_au.crt
SSLCertificateKeyFile /var/www/ssl/STAR_iconcierge_net_au.key
SSLCertificateChainFile /var/www/ssl/STAR_iconcierge_net_au.crt
</VirtualHost>
Обратите внимание, как *:80
(http) выполняет перезапись в *:443
(https), который затем применяет SSL с SSLEngine on
директива.
То, что вы на самом деле ищете, - это отправка заголовков HSTS с веб-сервера обратно пользователям, которые сообщают браузеру всегда получать доступ к сайту с помощью TLS. Нет никаких 301
перенаправление происходит там, как вы можете видеть из средств разработки в любом браузере.
Это происходит, например, с Google. Когда вы впервые посетили Google, он отправил вам заголовок HSTS, а ваш браузер сохранил заголовок в списке. После, когда вы попытаетесь подключиться к google.com
с участием http://
, браузер автоматически меняет способ подключения на https://
без связи с удаленным веб-сервером.
Это еще один механизм безопасности для предотвращения атак на уровень безопасности.
Ничего, что находится внутри <VirtualHost *:80>
Раздел будет обработан при входе на сайт через порт 443.
Протестируйте включение ssl-версии сайта по умолчанию, поставляемого с apache2, и попробуйте эту конфигурацию внутри <VirtualHost *:443>
У меня была такая же проблема, и я борюсь, пытаясь ее решить, и, наконец, я смог решить свою проблему, используя этот способ:
<VirtualHost *:443>
ErrorDocument 400 "https://example.com/?error-bad-request"
</VirtualHost>
Это перенаправит ваш запрос http
://example.com:443
к https
://example.com/?error-bad-request
Надеюсь, это сработает с вами.
По моему опыту, я просто удалил код в apache2.conf
<IfModule mod_ssl.c>
#Listen 443
</IfModule>
и настройки первой записи httpd-vhosts.conf. перезапустил и работал