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

Как я могу указать nginx обслуживать SSL только для одного домена?

Да, это что-то вроде дубликата этот вопросоднако, согласно документу ngnx "Настройка HTTPS-серверов"(раздел" Один HTTPS-сервер "), это ограничение больше не существует, и ответ на этот вопрос больше не действителен.

По ссылке выше:

До версии 0.7.14 SSL нельзя было включить выборочно для отдельных прослушивающих сокетов, как показано выше. SSL можно было включить только для всего сервера с помощью директивы ssl, что делало невозможным установку одного сервера HTTP / HTTPS. Для решения этой проблемы был добавлен параметр ssl директивы listen. Таким образом, использование директивы ssl в современных версиях не рекомендуется.

Однако, если серверный блок настроен, как указано в этом документе:

server {
        listen *:80;
        listen 443 ssl;

        server_name  example.com *.example.com;
[...]

... nginx по-прежнему будет обслуживать контент из example.com когда запрос на https://example.net сделан.

Я понимаю, что SSL обслуживается перед HTTP-запросом, но должен быть какой-то способ предотвратить ответ сервера на SSL-запросы, с которыми не связан действительный SSL-сертификат.

Мы очень ценим любое понимание этого.

должен быть какой-то способ предотвратить ответ сервера на запросы SSL, с которыми не связан действительный SSL

Ну вроде как. Поскольку у вас есть несколько сайтов, работающих на одном IP-адресе, пользователь, пытающийся установить SSL-соединение с этим IP-адресом для любого из сайтов всегда будет устанавливать свое SSL-соединение (и потенциально получить ошибку сертификата, если они указывают на имя хоста, не охваченное сертификатом).

Все, что вы можете сделать, чтобы предотвратить это, - это запретить SSL прослушивать этот IP-адрес (запускать ваши файлы SSL на разных адресах).

Если вы согласны с тем, что они получают SSL-соединение с этой потенциальной ошибкой, у вас есть варианты после; вместо получения контента с SSL-совместимого server, у вас может быть по умолчанию либо получение ошибки 403, либо перенаправление на прослушиватель http для имени хоста, на которое они отправили запрос - будет ли один из этих вариантов иметь смысл для вашей системы?

если для этого домена нет ssl, вы получите ошибку ssl браузера и закрытое соединение ...
Код ошибки: ERR_SPDY_PROTOCOL_ERROR

    server {
        listen 80;
        return 444;
    }

    server {
        listen 443;
        ssl_certificate     /etc/ssl/my.crt;
        ssl_certificate_key /etc/ssl/my.key;
        return 444;
    }

## no SSL domain
server {
        listen 80;
        server_name  domain.com *.domain.com;
}

## SSL domain
    server {
            listen 80;
            listen 443 spdy ssl;
            server_name  SSLdomain.com *.SSLdomain.com;

    }

Перенаправим весь другой домен в одну папку, в этой папке создадим индексный файл с мета-роботом noindex

server {
    listen   443;
    server_name yourdomainusessl.com;
    ssl on; 
    ssl_certificate      /etc/nginx/conf.d/ssl/....crt;
    ssl_certificate_key  /etc/nginx/conf.d/ssl/....key;
    ssl_trusted_certificate  /etc/nginx/conf.d/ssl/....crt; 
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
    ssl_prefer_server_ciphers on;
    if ($host = 'yourdomainusessl.com' ) {
         return 301 https://www.yourdomainusessl.com$request_uri;
    }
    if ($host !~* 'yourdomainusessl.com' ) {
         return 301 http://somewhereyouwant.com;
    }
}