У меня есть сертификат SSL с подстановочным знаком и несколько поддоменов на одном и том же ip. Теперь я хочу, чтобы мой nginx обрабатывал только упомянутые имена серверов и сбрасывал соединение для других, чтобы он выглядел так, как будто nginx
он не работает для незарегистрированных имен серверов (не отвечает, отклоняет, не работает, ни одного байта в ответе). Я делаю следующее
ssl_certificate tls/domain.crt;
ssl_certificate_key tls/domain.key;
server {
listen 1.2.3.4:443 ssl;
server_name validname.domain.com;
//
}
server {
listen 1.2.3.4:443 ssl;
server_name _;
// deny all;
// return 444;
// return 404;
//location {
// deny all;
//}
}
Я попробовал почти все в последнем блоке сервера, но безуспешно. Я получаю либо действительный ответ от известного виртуального сервера, либо код ошибки. Пожалуйста помоги.
Ответ cjc уже правильно указал на проблему с попыткой сопоставления имен хостов при включенном SSL. Тем не менее, это можно сделать так:
Примечание: да, это правда, что обычно
if
это зло , ноif
в этом случае его можно использовать безопасно . (Прочитайте ссылку на страницу, если вам нужно убедить себя.)В противоположность тому, что было предложено, простое добавление следующего блока не сработает:
потому что сертификат SSL, который совпадает
validname.domain.com
, не будет соответствовать некоторому случайному доменному имени. Я попробовал, и nginx действовал так, как будто блока вообще не было.Это также не будет работать:
потому что это сделает каждое соединение HTTPS на порту 443 неудачным, даже те, которые должны пройти. Я тоже попробовал это.
wget
сообщил об ошибке SSL рукопожатия.источник
Большинство ответов здесь о том, почему это не работает, а не о том , как заставить это работать.
Вот как - вам нужно сделать такой универсальный сервер «default_server» и указать пути к сертификату / ключу, чтобы он мог расшифровать входящий ssl-запрос и соответствовать заголовку Host:
Обратите внимание на ssl_certificate / ssl_certificate_key там. Если они не указаны, nginx все еще пытается использовать такой default_server и терпит неудачу, так как не может принять ssl-соединение без сертификата / ключа. Можно использовать любой сертификат / ключ, например, самоподписанный. ...
Чтобы создать самозаверяющий сертификат:
Также см. Https://serverfault.com/a/841643/87439.
источник
Я реализовал вышеупомянутое решение сегодня, и оно сработало плавно. Все URL, которые не указаны, теперь удалены. Размещение этого серверного кода до того, как фактическая запись виртуального сервера стала ключевой - все неправильно сформированные URL-адреса теперь отправляются на этот сервер по умолчанию.
источник
Вы должны быть в состоянии справиться с этим, сделав сервер, который обрабатывает незарегистрированные элементы, первым блоком сервера в вашей конфигурации.
Все домены, которые не определены конкретно, будут обрабатываться этим блоком сервера.
источник