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

Попросите Nginx отклонять неизвестные имена серверов по HTTPS

У меня есть экземпляр Nginx, использующий SNI для обслуживания нескольких доменов HTTPS с одного IP-адреса.

Единственная проблема с настройкой заключается в том, что Nginx отвечает первым (действующим по умолчанию) доменом всякий раз, когда запрашивается URL-адрес для голого IP-адреса сервера или домена, указанного на этом IP-адресе, для которого нет соответствующего блока HTTPS-сервера. В этом случае я бы предпочел просто вернуть стандартный 403 Forbidden - я бы настроил для этого серверный блок по умолчанию, но я не вижу способа обойти предупреждения о несоответствии сертификата клиента.

(Как c | C) я настраиваю Nginx для отклонения запросов к таким неизвестным / неопределенным доменам без необходимости указывать конкретный сертификат ssl, который нарушит работу браузеров? (т.е. мне нужно, чтобы Nginx отклонил запрос с ошибкой 403, прежде чем расстраивать клиента с помощью «плохого» сертификата - с точки зрения клиента это должно быть идентично случаю, когда блок HTTPS-сервера не определен вообще.)

Этот вопрос очень похож на тот, на который я ответил вчера: nginx и SNI: возможно ли автоматическое разрешение SSL-сертификата по имени домена

Невозможно отклонить соединение до того, как пользователь увидит сообщение о неверном сертификате в своем браузере. К тому времени, когда Nginx может вернуть ответ HTTP 403, квитирование SSL завершится, и для его завершения браузер должен принять предоставленный сертификат. Вы можете отклонить соединение только после того, как пользователь принял сертификат, настроив сервер по умолчанию:

server {
    listen 433 default_server ssl;
    ssl_certificate       common.crt;
    ssl_certificate_key   common.key;
    return 403;
}

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

Можно было бы отклонить соединения без действительного имени хоста, указанного SSL с помощью iptables, но это, вероятно, довольно сложно и вообще не будет соответствовать никаким стандартам.

Обновленная информация: Возможно return 444 чтобы прервать TCP-соединение непосредственно перед отображением ошибки сертификата.

Если ваши домены являются поддоменами одного и того же главного (* .example.com), вы можете использовать подстановочный сертификат. В противном случае я не думаю, что вы сможете предоставить какой-либо сертификат, который понравится браузеру.