@dm-kotlyar

Как заблокировать httpS запросы на IP адрес в Nginx?

Доброго времени суток.

Я хочу сделать на одном физическом сервере несколько сайтов. Использую Nginx. При этом я не хочу, чтобы по IP-адресу сайта или по не настроенному в Nginx домену открывался какой-либо из сайтов.

Для HTTP я сделал подобный конфиг:

server {
  listen 80 default_server;
  
  location / {
    deny all;
  }
}

server {
  listen 80;
  server_name example.com;

  location / {
    # тут настройки
  }
}


И всё работает отлично. Если я открываю сайт example.com - открывается нужная страница в соответствии с тем как описано в location. Если я пытаюсь открыть по IP или через другое доменное имя, которое также на этот же IP адрес ссылается, то получаю 403 ошибку.

И теперь я хочу сделать тоже самое с HTTPS.

Если я изменяю настройки default_server таким образом:
server {
  listen 80 default_server;
  listen 443 ssl default_server;
  
  location / {
    deny all;
  }
}

server {
  listen 443 ssl;
  server_name example.com;

  ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
  ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;

  location / {
    # тут настройки
  }
}

То при обращении к сайту https://example.com получаю ошибку в логе Nginx
[error] 5#5: *8 no "ssl_certificate" is defined in server listening on SSL port while SSL handshaking


А если из default server убираю строчку listen 443 ssl default_server, то при обращении с другого домена или по ip: https://1.2.3.4 открывается сайт https://example.com с неверным сертификатом.

Как правильно заблокировать httpS запросы на ip адрес в nginx?
  • Вопрос задан
  • 815 просмотров
Решения вопроса 1
ky0
@ky0 Куратор тега Nginx
Миллиардер, филантроп, патологический лгун
server {
  listen 443 ssl default_server;
 
  ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
  ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;

  location / {
    deny all;
  }
}


Важно понимать, что для HTTPS-сайта нужен какой-то сертификат, прописанный в конфиге. Для IP-адресов сертификаты не выдаются, соответственно, придётся подсовывать какой-то левый. Поэтому при попытке зайти на несуществующий у вас домен или по IP-адресу пользователь сначала получит предупреждение о невалидности сертификата и только после этого - 403 ошибку.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы