проблемы с настройкой nginx для обслуживания сайтов HTTP и HTTPS с одного сервера - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть один сервер, на котором размещено несколько веб-сайтов;
, чтобы уменьшить проблему, давайте предположим, что их всего два:
http://www.example-A.com
https://www.example-B.com

Сайт A предлагаеттолько HTTP-соединения, в то время как сайт B имеет собственный сертификат SSL и предлагает безопасные соединения.

Мой файл конфигурации выглядит следующим образом (соответствующая часть):

http
{
    server
    {
        listen 80;

        server_name www.example-A.com;

        [...]
    }

    server
    {
        listen 80;
        server_name www.example-B.com;
        return 301 https://www.example-B.com$request_uri;
    }

    server
    {
        listen 443 ssl;

        ssl_certificate /usr/local/nginx/ssl/www.exampe-A.com.crt;
        ssl_certificate_key /usr/local/nginx/ssl/www.exampe-A.com.key;
        ssl_prefer_server_ciphers on;

        server_name www.example-B.com;

        [...]
    }
}

Теперь, если я подключусь к http://www.example-A.com все работает нормально.
Также подключение к https://www.example-B.com работает как положено.
Подключение к http://www.example-B.com приводит к перенаправлению на https://www.example-B.com

Пока все хорошо.

Теперь проблема встает, если я попробую безопасное соединение с A: https://www.example-A.com

Я бы ожидал, что сервер откажется от соединения.

Вместо этого я получаю браузерпредупреждает, что соединение небезопасно.
Когда я продолжаю, я приземляюсь на домен https://www.example-A.com, но содержание www.example-B.com обслуживается.

Если я добавлю в конфигурацию

    server
    {
        listen 443 ssl;

        server_name www.example-A.com;

        return 444;
    }

Затем попытка безопасного подключения к A завершается неудачно, как и ожидалось.

Bно также не удается подключиться к https://www.example-B.com.


Чего мне не хватает?Почему директива server_name не соблюдается?

Как я могу обслуживать A в HTTP, B в HTTPS и блокировать неподдерживаемые HTTPS-соединения с A?


Iя бегу

$ nginx -V
nginx version: nginx/1.12.2
built with OpenSSL 1.1.0d  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local --sbin-path=/usr/local/sbin/nginx --conf-path=/usr/local/nginx/nginx.conf --with-http_ssl_module --with-http_stub_status_module --with-pcre=../pcre-8.37 --add-module=../headers-more-nginx-module-0.33

1 Ответ

0 голосов
/ 20 декабря 2018

Лучше всего иметь default_server, эта директива указывает использовать этот сервер, если имя хоста неизвестно, вы можете использовать его как универсальный для обработки любых имен хостов, которые несоответствует вашему server_name значению.Без этого первый сервер считается по умолчанию

, например,

# 444 Close connection Without Response on requests without hostname
server {
    listen 80 default_server;
    listen 443 ssl default_server;
    server_name _;
    ssl_certificate /path/to/ssl/example.com.crt;
    ssl_certificate_key /path/to/ssl/example.com.key;
    return 444;
}
...