2

Я застрял с настройкой nginx относительно поддержки SSL и SNI.

Чтобы упростить мой случай, скажем, у меня есть два домена, foo.com и bar.com . У меня только один IP и оба домена сопоставлены с этим. Я хочу, чтобы foo.com был доступен через https , но не через bar.com . Последний должен быть просто недоступен на порту 443. Я знаю, что это невозможно с простым SSL, но мне сказали, что я могу смело полагаться на SNI в эти дни. Поэтому я предполагаю, что мой браузер (Chrome) отправляет домен веб-сайта, к которому он хочет получить, наряду с запросом инициализации SSL.

Если я bar.com , nginx использует настроенный сертификат, выданный для bar.com , идеально. Если я захожу на https://foo.com , для которого фактически нет директивы listen *:443 , nginx также отвечает сертификатом bar.com , поэтому Chrome генерирует исключение сертификата. Я попытался настроить директиву прослушивания SSL для foo.com и безуспешно добавил следующий код в vhost:

if ($server_port = 443) {
  return 444;
}

Теперь он отправляет неверный сертификат и только потом запрещает соединение.

Можно ли разрешить nginx закрыть соединение перед отправкой ответа SSL в браузер, если nginx не может найти соответствующий сертификат для запрашиваемого домена?

1 ответ1

0

Nginx использует первый подходящий (по наличию порта и ssl) виртуальный хост, когда он не может найти виртуальный хост для данного домена. Вам необходимо добавить запись server {} перед всеми остальными записями server {} чтобы Nginx использовал ее для https://foo.com и других запросов HTTPS с неизвестным доменом:

server {
    listen 443 ssl;

    ssl_certificate /path/to/certificate.crt;
    ssl_certificate_key /path/to/certificate.key;

    return 404;
    # or return 444; to just drop such connections
    # or return 302 http://$host$request_uri; to redirect them to HTTP
}

Для работы требуется SSL-сертификат, но вы можете сгенерировать самоподписанный (сертификат не обязательно должен быть действительным).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .