Да, это что-то вроде дубликата этот вопросоднако, согласно документу 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;
}
}