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

Как я могу заставить Nginx отбрасывать SSL-запросы с неправильного домена?

Итак, у меня есть сервер с одним IP и множество веб-сайтов, все они размещены на nginx. Вот очень упрощенное сокращение моей фактической настройки:

server {
    listen 80;
    listen 443 ssl;
    server_name ssl.example.com;
    #...
}

server {
    listen 80;
    server_name nossl.example.com;
    #...
}

Если я подключусь к ssl.example.com:443 все работает, как положено.
Если я подключусь к nossl.example.com:443, он пытается обслуживать содержание ssl.example.com:443.

Я помирился с почему это происходит (именно так ssl + nginx лучше всего подходит для виртуального сервера), мне просто нужно остановить отправку контента с неправильного сайта.

Если не считать покупки сертификатов для всех моих сайтов (или выпуска собственных) или переноса SSL-сайта на собственный IP-адрес, какие у меня здесь варианты? Может ли nginx дважды проверять домен для каждого запроса SSL и убедиться, что он соответствует этому server_name?

Добавьте следующий виртуальный сервер:

server {
  listen 443 ssl;
  server_name _;

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

  return 444;
}

Если ни один хост не подходит, Nginx будет использовать его как последнее средство и отправит обратно ошибку.

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

Я склонен думать, что №2 является наиболее правильным ответом, но я обнаружил, что следующее работает также, когда размещено над серверным блоком виртуальных серверов без SSL.

server {
  listen 443;
  server_name .example.com;
  return 444;
}

Не используйте флаг «ssl».