2015-02-03 3 views
12

Я настраиваю Apache с несколькими отдельными сертификатами SSL для разных доменов, которые находятся на одном сервере (и, таким образом, используют один и тот же IP-адрес).Как имитировать не-SNI-браузеры (без поддержки SNI)?

С Qualys SSL Test Я обнаружил, что есть клиенты (т. Е. BingBot as of december 2013), которые не поддерживают расширение SNI.

Итак, я думаю о создании специального веб-приложения по умолчанию, которое может собирать запросы таких клиентов, но как имитировать эти клиенты?

Я нахожусь в Windows 8 без доступа к ящикам Linux, если это имеет значение.

ответ

1

Вы можете установить Strawberry Perl, а затем использовать следующий скрипт для моделирования клиента не поддерживает SNI:

use strict; 
use warnings; 
use LWP::UserAgent; 

my $ua = LWP::UserAgent->new(ssl_opts => { 
    # this disables SNI 
    SSL_hostname => '', 
    # These disable certificate verification, so that we get a connection even 
    # if the certificate does not match the requested host or is invalid. 
    # Do not use in production code !!! 
    SSL_verify_mode => 0, 
    verify_hostname => 0, 
}); 

# request some data 
my $res = $ua->get('https://example.com'); 

# show headers 
# pseudo header Client-SSL-Cert-Subject gives information about the 
# peers certificate 
print $res->headers_as_string; 

# show response including header 
# print $res->as_string; 

Устанавливая SSL_hostname в пустую строку, вы можете отключить SNI, отключить эту линию снова позволяет SNI.

12

Вы можете использовать наиболее часто используемую библиотеку SSL, OpenSSL. Для загрузки доступны двоичные файлы Windows.

openssl s_client -connect domain.com:443 команда служит для проверки SSL-соединения с клиентской стороны. По умолчанию он не поддерживает SNI. Вы можете добавить аргумент -servername domain.com, чтобы включить SNI.

+0

Это верно для OpenSSL релизов 1.1.0 * и раньше. В 1.1.1 * builds s_client по умолчанию добавляет расширение «имя_сервера» (с любым хостом, указанным в параметре «-connect»). Если вы не хотите отправлять «имя_сервера» в новой версии, вы должны отключить его с помощью «-noservername». – Andrew

3

О специальном веб-приложении по умолчанию ... Вы не можете этого сделать.

Вы не можете этого сделать, потому что ограниченные клиенты не просто открывают другую страницу, но полностью терпят неудачу.

  1. Рассмотрите, что у вас есть «по умолчанию» vhost, который откроется не-SNI-клиенту.

  2. У вас также есть дополнительный призрак, который должен быть открыт клиентом, поддерживающим SNI.

  3. Очевидно, что эти два должны иметь разные имена хостов (скажем, default.example.com и www.example.com), иначе Apache или nginx не знали бы, какой сайт показывать, на какой подключаемый клиент.

Теперь, если не-SNI клиент пытается открыть https://www.example.com, он будет представлен сертификат от default.example.com, который даст ему ошибку сертификата. Это серьезное предостережение.

Исправление этой ошибки состоит в том, чтобы сделать сертификат SAN (multi-domain), который будет включать как www.example.com, так и default.example.com. Затем, если клиент, не являющийся SNI, пытается открыть https://www.example.com, ему будет предъявлен действительный сертификат, но даже тогда его заголовок Host: будет по-прежнему указывать на www.example.com, и его запрос будет перенаправлен не на default.example.com, а на www.example.com.

Как вы можете видеть, вы либо полностью блокируете клиентов, не являющихся SNI, либо пересылаете их ожидаемому призму. Не существует разумного варианта для веб-приложения по умолчанию.

1

Подобно OpenSSL s_client является GnuTLS-консоли

gnutls-cli --disable-sni www.google.com 
Смежные вопросы