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

Apache 2.4 разрывает соединение на хосте SSL по умолчанию

Я использую Apache 2.4 на Debian, обслуживающий некоторые веб-сайты SSL. Мое доменное имя и сертификаты содержат мое настоящее имя, поэтому я не хочу, чтобы какой-либо случайный пользователь вводил мой IP-адрес, чтобы получить сертификат и мое имя.

Мой подход заключался бы в создании виртуального хоста по умолчанию на порту 443, чтобы разорвать все соединения с использованием modsecurity, поэтому вы получите сертификат, только если знаете имя домена. С SNI это должно быть возможно - Apache определяет правильный виртуальный хост перед рукопожатие TLS, верно?

Однако похоже, что это не работает должным образом. Если я включаю хост по умолчанию, каждое соединение TLS, кажется, разрывается, и я получаю ошибку SSL_ERROR_RX_RECORD_TOO_LONG в браузере.

Это моя конфигурация:

<VirtualHost *:443>
    ServerName defaultserverssl
    DocumentRoot /var/www/html
    SecRuleEngine On
    SecAction id:1,phase:1,nolog,drop
</VirtualHost>

<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName www1.example.com
    DocumentRoot /my/document/root

    SSLCertificateFile /path/to/myfullchain.pem
    SSLCertificateKeyFile /path/to/myprivkey.pem
    Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName www2.example.com
    DocumentRoot /my/document/root

    SSLCertificateFile /path/to/myfullchain.pem
    SSLCertificateKeyFile /path/to/myprivkey.pem
    Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

Я уже пробовал SSLStrictSNIVHostCheck возможность принудительно установить SNI, как на уровне сервера, так и в отдельных хостах, без разницы в результате.

Похоже, что SNI не работает, или я ошибаюсь в том, как работает SNI, и мой подход невозможен?

Я нашел способ решения моей проблемы.

Насколько я понимаю, с SNI клиент отправляет запрошенное имя сервера в расширенном приветственном сообщении клиента TLS, поэтому нет способа избежать первоначального рукопожатия TLS (или, по крайней мере, я не нашел способ разорвать соединение только после прием приветствия клиента).

В качестве обходного пути я создал самозаверяющий сертификат (не содержащий личной информации), который я использую с хостом по умолчанию. После сброса рукопожатия соединение вроде работает.

<VirtualHost *:443>
    ServerName defaultserverssl
    DocumentRoot /var/www/html

    SSLEngine On
    SSLCertificateFile /path/to/self-signed/default.crt
    SSLCertificateKeyFile /path/to/self-signed/default.key

    SecRuleEngine On
    SecAction id:1,phase:1,nolog,drop
</VirtualHost>