Итак, у меня есть сервер с одним IP и множество веб-сайтов, все они размещены на nginx. Вот очень упрощенное сокращение моей фактической настройки:
server {
listen 80;
listen 443 ssl;
server_name ssl.example.com;
#...
}
server {
listen 80;
server_name nossl.example.com;
#...
}
Если я подключусь к ssl.example.com:443
все работает, как положено.
Если я подключусь к nossl.example.com:443
, он пытается обслуживать содержание ssl.example.com:443
.
Я помирился с почему это происходит (именно так ssl + nginx лучше всего подходит для виртуального сервера), мне просто нужно остановить отправку контента с неправильного сайта.
Если не считать покупки сертификатов для всех моих сайтов (или выпуска собственных) или переноса SSL-сайта на собственный IP-адрес, какие у меня здесь варианты? Может ли nginx дважды проверять домен для каждого запроса SSL и убедиться, что он соответствует этому server_name
?
Добавьте следующий виртуальный сервер:
server {
listen 443 ssl;
server_name _;
ssl on;
ssl_certificate /path/to/certificate.crt;
ssl_certificate_key /path/to/certificate.key;
return 444;
}
Если ни один хост не подходит, Nginx будет использовать его как последнее средство и отправит обратно ошибку.
Для работы ему нужен сертификат SSL, но вы можете очень быстро сгенерировать самоподписанный один из них, и он подойдет. Это лучше, чем совместное использование действительного существующего сертификата для другого домена (который в любом случае вызывает ошибки), потому что утечка меньше.
Я склонен думать, что №2 является наиболее правильным ответом, но я обнаружил, что следующее работает также, когда размещено над серверным блоком виртуальных серверов без SSL.
server {
listen 443;
server_name .example.com;
return 444;
}
Не используйте флаг «ssl».