Я использую 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>