id_pripyat
@id_pripyat

Работает сайт по HTTPS версии IP. Как исправить?

Я не силен в NGINX, приходится разбираться самому. У меня возникла проблема, пытался ограничить доступ по IP к сайту с помощью:

server {
listen 80;
server_name _;
return 444;
}


Однако, обнаружил, что при открытии HTTPS версии сайта - по IP к сайту можно обращаться. Что делать? Вот мой конфиг:

server {
	 root /var/www/birppl.ru/html;
	 index index.html index.htm index.nginx-debian.html;
	 server_name birppl.ru www.birppl.ru;
	 location / {
	 proxy_pass http://localhost:9000;
	 proxy_http_version 1.1;
	 proxy_set_header Upgrade $http_upgrade;
	 proxy_set_header Connection 'upgrade';
	 proxy_set_header Host $host;
	 proxy_cache_bypass $http_upgrade;
}

    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl http2; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/birppl.ru/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/birppl.ru/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

server {
     if ($host = birppl.ru) {
         return 301 https://$host$request_uri;
     } # managed by Certbot

     listen 80; 
     listen [::]:80; 
     server_name birppl.ru www.birppl.ru;
     return 404; # managed by Certbot
}
  • Вопрос задан
  • 119 просмотров
Решения вопроса 1
Господа не выдумываем велосипед
Работа HTTPS в корне отличается от HTTP
При обращение по http ты вначале получаешь имя сайта из отета сервера на основание этого имени подставляется конфиг.
НО при HTTPS вы вначале получаете ключи, и только после этого множите получить хоть байт информации с канала.
Как следствие этого два постулата:
1. Если у вас есть хоть один сайт с https у всех остальных он появляется автоматически, хотите вы этого или нет, поскольку механизм разобра конфигов идет после установления канала, это фундоментально!
Так что при обращение по IP вы в любом случае получите ключи https, поскольку это тупо демон на порту.
2. Если нет пары ключей для именно этого домена, в частности IP будем считать как домен не имеющий явных ключей для себя. ТО от безвыходности веб сервер берет БЛИЖАЙШИЕ ключи сортируя их по имени то есть как правило это 000-default.conf
В котором у вас лежат как-раз таки дефолтные ключи, может быть даже самоподписаные, НО только после этого у вас возможно получене http reffer.
ну все что остается это завести ненужного товарищя в тупик
например вот так.

server {

listen 443 ssl;
       server_name default_server ;
       ssl_certificate        /etc/ssl/certs/ssl-cert-snakeoil.pem;
       ssl_certificate_key    /etc/ssl/private/ssl-cert-snakeoil.key;
       root /var/www/html;
       return 444;
}

Но не пытайтесь ограничить сайт по именам до получения ключей это просо невозможно
Намного проще сделать отдельный конфиг для этого айпи и уводить его в ловушку. чем ловить чего через default_server
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы