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

7

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

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

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

Карлтон Гибсон
источник

Ответы:

7

Этот вопрос очень похож на тот, на который я отвечал вчера: 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 непосредственно перед отображением ошибки сертификата.

xblax
источник
Используя SNI, вы можете теоретически прервать соединение, если для данного доменного имени нет сертификата, что было бы лучше, чем отображение сертификата об ошибке. Ты знаешь как это сделать?
Йогу
Да, я обнаружил, что можно return 444прервать соединение tcp, прежде чем отобразится ошибка сертификата.
xblax
@xblax Не могли бы вы также сказать нам, КАК вернуть 444, прежде чем сертификат будет показан? В идеале я бы не тратил ресурсы на рукопожатие для запроса к server_name, которое я не знаю. SNI должен раскрыть запрошенное имя еще до того, как расшифровать запрос.
Статический шторм
0

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

Крис Нава
источник
Привет крис Я ценю подстановочный знак, но это не совсем то, что я спрашиваю. Да, браузеру не понравится какой-либо сертификат, НО есть ли способ отклонить соединение на основе запрошенного имени сервера? (Я подозреваю, что нет, но это, кажется, место, чтобы спросить ... :)
Карлтон Гибсон
Непроверенное предположение -> Вам нужно будет предоставить действительный сертификат, иначе браузер сочтет соединение небезопасным. Поэтому браузер не будет действовать при любом перенаправлении, которое вы отправляете, пока пользователь не разрешит переопределение. Единственный способ автоматически выполнить переопределение, о котором я могу подумать, - предоставить действительный сертификат. :-(
Крис Нава