![Конфигурация Apache SSL — Недопустимый метод в запросе \x16\x03\x01](https://rvso.com/image/617811/%D0%9A%D0%BE%D0%BD%D1%84%D0%B8%D0%B3%D1%83%D1%80%D0%B0%D1%86%D0%B8%D1%8F%20Apache%20SSL%20%E2%80%94%20%D0%9D%D0%B5%D0%B4%D0%BE%D0%BF%D1%83%D1%81%D1%82%D0%B8%D0%BC%D1%8B%D0%B9%20%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%20%D0%B2%20%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B5%20%5Cx16%5Cx03%5Cx01.png)
Я пытаюсь настроить службу https на гостевом экземпляре VirtualBox, на котором запущены Debian Squeeze и Apache 2.
При попытке загрузить тестовую страницу моего виртуального хоста в браузере с моего хост-компьютера Win7 я получаю сообщение об ошибке «ssl_error_rx_record_too_long". В то же время в журнале ошибок Apache указано: "Неверный метод в запросе \x16\x03\x01" по этому запросу. Проблема, вероятно, не связана с тем фактом, что я запускаю Apache внутри гостевой системы VirtualBox, но хотел бы нарисовать вам полную картину.
Самое интересное, что я уже дошел до точки, где сайт загружается правильно, но только для запросов, поступающих с localhost (т.е. из VirtualBox Debian Guest). Я проверил это с помощью lynx и wget, они работают как и ожидалось:
wget https://ssltest.intra/ssl.html
--2013-09-13 07:26:49-- https://ssltest.intra/ssl.html
Resolving ssltest.intra (ssltest.intra)... 127.0.0.1
Connecting to ssltest.intra (ssltest.intra)|127.0.0.1|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 122 [text/html]
Saving to: `ssl.html.1'
100%[======================================>] 122 --.-K/s in 0s
2013-09-13 07:26:49 (1.94 MB/s) - `ssl.html.1' saved [122/122]
Содержимое сохраненного файла в точности соответствует ожидаемому. Более того, если я попытаюсь связаться с сервером через простой текстовый HTTP, он справедливо отправит меня в лучшее место:
telnet ssltest.intra 443
Trying 127.0.0.1...
Connected to ssltest.intra.
Escape character is '^]'.
GET /ssl.html
<!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://ssltest.intra/"><b>https://ssltest.intra/</b></a></blockquote></p>
<hr>
<address>Apache/2.2.22 (Debian) Server at ssltest.intra Port 443</address>
</body></html>
Connection closed by foreign host.
Файлы конфигурации ниже (я удалил из конфигурации все, кроме самого минимума, необходимого для работы этого SSL-сайта)
порты.conf:
Listen 443
httpd.conf: пусто
ssltest.intra: (конфигурация виртуального хоста)
<VirtualHost *:443>
ServerName ssltest.intra
ServerAdmin [email protected]
SSLEngine On
SSLCertificateFile /etc/ssl/certs/ssltest.intra.crt
SSLCertificateKeyFile /etc/ssl/certs/ssltest.intra.key
DocumentRoot /var/www/ssltest.intra
Options FollowSymLinks
<Directory /var/www/ssltest.intra/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
php_value error_log /var/www/ssltest.intra/php_errors.log
ErrorLog /var/log/apache2/ssltest.intra.error.log
LogLevel warn
CustomLog /var/log/apache2/ssltest.intra.access.log combined
</VirtualHost>
Я проверил, что ключи сертификата находятся в указанном месте и являются действительными (непросроченными) ключами для домена. Указанная выше конфигурация виртуального хоста была включена с помощью a2ensite ssltest.intra
. mod_ssl был включен, apache2 перезапущен (несколько раз). Когда я запускаю apache, в журнале появляется следующая запись:
Apache/2.2.22 (Debian) PHP/5.3.3-7+squeeze14 with Suhosin-Patch mod_ssl/2.2.22
OpenSSL/1.0.1e mod_perl/2.0.4 Perl/v5.10.1 configured -- resuming normal operations
Не существует правил брандмауэра, которые бы запрещали любое взаимодействие через порт 443.
Что я упускаю?
РЕДАКТИРОВАТЬВидимо, это как-то связано с настройкой сети VirtualBox. Когда я пытаюсь подключиться к сайту локально как 127.0.0.1, все работает как и ожидалось. Когда я пытаюсь подключиться (также локально) через другой интерфейс NAT (192.168.56.10), запрос отклоняется. Есть какие-нибудь советы, как решить эту проблему?
решение1
Подозреваю, что мой случай такой же, как у user242156, и, вполне возможно, у изначального автора. Проблема была в том, что мои файлы конфигурации в sites-enabled/ на самом деле не читались, потому что apache2.conf дистрибутива включал только sites-enabled/*.conf, а мои файлы не использовали это расширение, так как оно не требуется, например, в Ubuntu.
Поэтому правильным решением будет переименовать ssltest.intra в ssltest.intra.conf или, если это действительно неприемлемо, изменить apache2.conf, добавив строку IncludeOptional sites-enabled/*
.
решение2
Была та же проблема. В моей ситуации сработало следующее решение (Apache 2.2/Debian Squeeze)
Похоже, что конфигурация ssl не была загружена в момент прослушивания. После множества попыток и ошибок с конфигурацией виртуального хоста я добавил конфигурацию для SSL в apache2.conf вместо части директивы виртуального хоста. Порты настроены в ports.conf. После этого мой ssl заработал правильно. Похоже, проблема с последовательностью загрузки частей конфигурации.
Добавлена часть SSL в конец apache2.conf
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/<server certificate filename>
SSLCertificateKeyFile /etc/apache2/ssl/<privatekey filename>
SSLCACertificateFile /etc/apache2/ssl/CaCert.crt
записи уже присутствуют в ports.conf
# If you just change the port or add more ports here, you will likely also
have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default
# This is also true if you have upgraded from before 2.2.9-3 (i.e. from
# Debian etch). See /usr/share/doc/apache2.2-common/NEWS.Debian.gz and
# README.Debian.gz
Listen 80
<IfModule mod_ssl.c>
# SSL name based virtual hosts are not yet supported, therefore no
# NameVirtualHost statement here
Listen 443
</IfModule>