Nginx. Як я відхиляю запит на невіртований віртуальний сервер ssl?


14

У мене є одне підключення 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;
  //}
}

Я спробував майже все в останньому блоці сервера, але успіху не було. Я отримую або дійсну відповідь від відомого віртуального сервера, або код помилки Будь ласка, допоможіть.

Відповіді:


7

Це не працює таким чином: рукостискання SSL відбувається перед HTTP, тому ім'я в сертифікаті буде оцінено в браузері, перш ніж ви зможете перенаправляти або робити що-небудь ще в конфігурації nginx.


це погано, але треба визнати) Спасибі
andbi

3
Це неправда: ви можете зробити щось інше на нижчому рівні, як, наприклад, перервати з'єднання без будь-якої відповіді, як пояснено в інших відповідях.
collimarco

14

Відповідь cjc вже правильно вказала на проблему зі спробою узгодження імен хостів, коли SSL увімкнено. Однак це можна зробити так:

server {
    ...

    if ($host !~* ^validname\.domain\.com$ ) {
        return 444;
    }
    ...
}

Примітка: так це правда, що загалом ifце зло , але ifв цьому випадку це безпечно . (Прочитайте пов’язану сторінку, якщо вам потрібно переконати себе.)

Всупереч запропонованому, додавання наступного блоку не працюватиме:

server {
    listen 80;
    listen 443 ssl;
    return 444;
}

тому що сертифікат SSL, який відповідає validname.domain.com, не відповідає деякому випадковому доменному імені. Я спробував це, і nginx діяв так, що блок взагалі не присутній.

Це також не буде працювати:

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

тому що це призведе до виходу з ладу кожного з'єднання HTTPS на порту 443, навіть тих, які повинні пройти. Я теж спробував цей. wgetповідомили про помилку рукостискання з SSL.


Ця відповідь абсолютно правильна. Просто для тих, хто сумнівається, слід додати цей розділ до конфігурації робочого сервера. Тож для конфігуратора тематичного стартера був би сервер {liste 443 ssl; ім’я_сервера-ім’я_файла.domain.com; if ($ host! ~ * ^ допустиме ім'я \ .domain \ .com $) {return 444; }}
Іван Яремчук

6

Більшість відповідей тут стосується того, чому це не працює, а не як змусити його працювати.

Ось як - вам потрібно зробити такий сервер загальноприйнятих сервером "default_server" і потрібно надати шляхи до cert / key, щоб він міг розшифрувати вхідний запит ssl та відповідати заголовку хосту:

server {
    listen 80 default_server;
    listen 443 ssl default_server;
    server_name _;
    ssl_certificate <path to cert>;
    ssl_certificate_key <path to key>;
    return 404;
}

Зверніть увагу на ssl_certificate / ssl_certificate_key там. Якщо вони не вказані, nginx все ще намагається використовувати такий сервер default_server і не спрацьовує, оскільки він не може прийняти з'єднання ssl w / oa cert / key. Можна використовувати будь-який сертифікат / ключ, наприклад, самопідписаний. ...

Щоб створити сертифікат самопідписання:

openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365 

Також дивіться /server//a/841643/87439


1
Ви пробували це? Як створити сертифікат SSL, який відповідає імені сервера "_"?
Тім

Так, це рішення працює для мене. У мене була така ж точна проблема, і я зрозумів з документації, що nginx потребує cert / key, оскільки він не дивиться на TLS SNI. Ви можете використовувати будь-який сертифікат / ключ, наприклад самопідписатись.
andreycpp

1

Я реалізував вищезазначене рішення сьогодні, і воно працювало плавно. Усі URL-адреси, які не вказані, зараз скидаються. Розміщення цього серверного коду перед фактичним входом віртуального сервера було ключовим - усі неправильно сформовані URL-адреси тепер переходять на цей "за замовчуванням" сервер.

... 
server {
     listen       443;
     server_name    _;
     return 444; }

server {
     listen       443;
     server_name  [URL]

0

Ви повинні мати можливість це впоратися, зробивши сервер, який обробляє незазначені елементи, перший серверний блок у вашій конфігурації.

http {
    ...

    server {
        listen 80;
        listen 443 ssl;
        return 444;
    }

    server {
        server_name validname.domain.com;
        ...
    }
}

Цей доменний сервер буде оброблятися всіма доменами, не визначеними спеціально.


1
Це не працює
AmirHossein
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.