как ssl, так и non-ssl на одном порту


1

Я хотел бы, чтобы мой веб-сервер apache2 обслуживал и http, и https на одном и том же порту.
С другим методом, который я попробовал, он либо не работал на http или https ..

Как я могу это сделать?

Обновление:
если я включаю SSL и затем посещаю страницу с http, я получаю такую ​​страницу:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
Reason: You're speaking plain HTTP to an SSL-enabled server port.<br />
Instead use the HTTPS scheme to access this URL, please.<br />
<blockquote>Hint: <a href="https://server/"><b>https://server/</b></a></blockquote></p>
<hr>
<address>Apache/2.2.9 (Debian) PHP/5.2.6-1+lenny16 with Suhosin-Patch mod_ssl/2.2.9 OpenSSL/0.9.8g Server at server Port 443</address>
</body></html>

Из-за этого, кажется, очень возможно иметь и http и https на одном и том же порту.
Первым шагом будет изменение этой страницы по умолчанию, чтобы она отображала заголовок 301-Moved.

Update2: в соответствии с этим , это возможно. Теперь вопрос заключается в том, как настроить Apache для этого.


Во- первых, это было бы большой идеей , чтобы сказать нам , какой метод вы пробовали это не сработало. Во-вторых, почему вы хотите это сделать? Стандартный порт для HTTPS является 443, и если вы меняете , что , например , 80, вам необходимо открыть сайт в браузере , как это: https://example.com:80. Третье: я не верю, что это все равно возможно.
Свен

У нас есть другие службы на нестандартных портах, таких как 999. Теперь я хочу, чтобы наши пользователи могли использовать оба сервера: 999 и сервер: 999 .
Зулакис

Apache даже говорит вам, что он не может делать то, что вы хотите.
Свен

Нет это не так. Он говорит мне, что он принимает только соединения https (очевидно, из соображений безопасности). То, что он на самом деле говорит мне, это доказательство того, что он может выполнять http и https на одном и том же порту.
Зулакис

1
@Zulakis Да, можно обнаружить протокол, который клиент пытается использовать, прежде чем сервер отправит какой-либо ответ, но невозможно настроить Apache для обслуживания чего-либо, кроме ошибок через HTTP, через порт HTTPS. Чтобы сделать это, вам, вероятно, придется сильно изменить mod_ssl.
Шейн Мэдден

Ответы:


3

Трафик SSL не может работать на том же порту, что и трафик, отличный от трафика SSL, TLS может это делать, но он не используется на веб-серверах. Именно по этой причине TLS в основном используется на SMTP-сервере.

Один и тот же вопрос уже задавался несколько раз (см. Два примера ниже) разными людьми, и всегда говорили, что при использовании одного Apache это невозможно, вам придется использовать какое-то другое программное обеспечение или создать своего собственного слушателя:

Apache2 Переписать http на https через порт 5553

Apache отвечает как HTTP, так и HTTPS на один и тот же порт

Также я не смог найти ни одного официального документа Apache, в котором упоминается трафик http и https на одном и том же порту без некоторого перенаправления.

Имейте в виду, что когда люди говорят SSL, они обычно имеют в виду SSL / TLS, которые не совпадают.

Я бы принял этот ответ от apache.org как категорическое НЕТ на ваш вопрос по работе с http и https на одном и том же порту

    Can we have both http and https listening on the same port?

Comment 1 Eric Covener 2011-11-22 14:36:45 UTC

No, and bugzilla is not for support or Q&A.  Try the users mailing list.

https://issues.apache.org/bugzilla/show_bug.cgi?id=52228

Вы можете попробовать модуль mod_rewrite, но я предлагаю вам открыть еще один вопрос о том, как использовать его для перенаправления https (вам все равно потребуется несколько портов). Я не работал с этим, поэтому не могу дать вам подробную информацию о том, как это сделать.

Как я уже сказал, не знаю много о модуле, поэтому я предполагаю, что вам понадобится три порта. Один не-SSL порт для прослушивания mod_rewrite, один не-SSL для трафика http и один порт SSL для https, вам нужно будет настроить порт 999 для mod_rewrite, а затем ваши службы будут прослушивать два разных порта для http и https.

Обратите внимание на то, что сказал Шейн Мэдден в своем комментарии: запрос http на порт с поддержкой SSL выдаст вам только ошибки, даже если вы установите mod_rewrite на этот порт.


Пожалуйста, посмотрите на мой обновленный первоначальный пост.
Зулакис


Ладно, согласно постам это возможно. Теперь, как я могу сделать это с apache2?
Зулакис

1
SSL является предшественником TLS, и, насколько я знаю (может быть неправильно), соединения https на стороне сервера используют соединение SSL. TLS отправляет первое приветственное сообщение в виде открытого текста, а затем проверяет, получает ли он зашифрованный или незашифрованный ответ, и на основании этого клиента отправляет данные либо в виде открытого текста, либо в зашифрованном виде. SSL запускается с начала encyrption, поэтому ни сервер, ни клиент не могут выбрать тип трафика
rAlen

1
@Zulakis взгляните на мой ответ, я его отредактировал, говорю точно, невозможно
rAlen

2

Можно перенаправить http в https с помощью пользовательского ErrorDocument.
Однако в текущей версии Apache запуск всего веб-сервера по протоколам http и https невозможен.

К сожалению, в Apache 2.2-16 есть ошибка, которая еще не исправлена, из-за которой перенаправление работает только в Apache 2.4.

Для получения дополнительной информации посмотрите здесь: https://issues.apache.org/bugzilla/show_bug.cgi?id=50823

Обновление
Вот фрагмент кода, который я тестирую с помощью Apache 2.4:

<?php
if ($_SERVER["REDIRECT_STATUS"] == "400" && preg_match("/.*?Reason: You're speaking plain HTTP to an SSL-enabled server port\..*/", $_SERVER["REDIRECT_ERROR_NOTES"])) {
    header("Location: https://localhost:999");
} else {
    //echo normal error message
}
?>

Используйте его, установив ErrorDocument 400 /redirect-400-error.phpв вашем конфигурационном файле apache. Вы можете найти больше информации о реализации пользовательских ErrorDocuments здесь.


1

Простое решение:

ErrorDocument 400 https://server:port/

Теперь вы получаете перенаправление «Найдено» и никаких неприятных сообщений об ошибках.


Это почти то же самое решение, которое я придумал выше. Просто без проверки, если это на самом деле ошибка http://вместоhttps://
Zulakis

Как это не проверяет ошибку? Apache уже знает, что есть ошибка, поэтому у вас есть статус 400 для начала. То, что вы сделали со своим кодом, было переписать что-то, что уже сделал Apache ... Вы думаете об этом. ;-)
Катализатор

Если код когда-либо выдает ошибку 400, это явно неправильно.
Тим Людвински

0

Я думаю, что это может работать путем определения статического ErrorDocument, например:

ErrorDocument 400 /redirect_https.txt

Затем создайте файл redirect_https.txtв корневом каталоге вашего документа со следующим содержимым:

HTTP/1.1 302 Found
Location: https://www.example.com/mypage.html

Это работает (даже пытался) и отправляет браузеру «фальшивый» HTTP-редирект.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.