Назад | Перейти на главную страницу

Обслуживающий порт 443 через http создает ошибку 400 Bad Request вместо перенаправления

Поэтому для потомства я пытаюсь настроить свой сервер так, чтобы даже когда кто-то пытается перейти на 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. перезапустил и работал