У меня есть nginx и разные поддомены:
a.mydomain.com
b.mydomain.com
c.mydomain.com
У Nginx есть 4 правила:
1) переписать правило:
server {
listen 80
server_name gl.udesk.org;
root /nowhere;
rewrite ^ https://a.mydomain.com$request_uri permanent;
}
2) правило https:
server {
listen 443;
server_name a.mydomain.com;
root /home/a/a/public;
ssl on;
ssl_certificate conf.d/ssl/a.crt;
ssl_certificate_key conf.d/ssl/a.key;
ssl_protocols ...
ssl_ciphers ...
ssl_prefer_server_ciphers on;
location ...
}
3) правило http по умолчанию:
server {
listen 80 default_server;
return 444;
}
4) правило по умолчанию https:
server {
listen 443 default_server;
return 444;
}
Так что, если я запускаю nginx и:
- если я захожу в браузер на http://a.mydomain.com, он перенаправляется на https://a.mydomain.com, а затем возвращает ошибку 107 (net :: ERR_SSL_PROTOCOL_ERROR): ошибка протокола SSL.
- если я захожу в браузер на https://b.mydomain.com, я ожидаю, что он вернет ошибку 444 обратно. Но вместо этого он возвращает ту же ошибку 107 (net :: ERR_SSL_PROTOCOL_ERROR): ошибка протокола SSL.
- и так для всех зарегистрированных провайдером DNS CNAME (то есть a, b, c)
- все http-версии (например, правило 3 -) работают должным образом:
- http://a.mydomain.com перенаправляет на версию https: //,
- http://b.mydomain.com и http://c.mydomain.com возвращают ошибку 444 в соответствии с настройкой.
Итак, почему правила https в nginx так сложно настроить, и как мне правильно их настроить, чтобы получить то же поведение, что и в версии http?
Обновить:
Создание нового сертификата и добавление:
ssl on;
ssl_certificate conf.d/ssl/default.crt;
ssl_certificate_key conf.d/ssl/default.key;
сейчас работает, но у меня было бы решение без какого-либо SSL-сертификата. Просто сбросьте все соединения для всех субдоменов https (порт 443), кроме https://a.mydomain.com без предоставления сертификата.
nginx
не достаточно умен, чтобы понять, что ему не нужен сертификат для того, что пользователь хочет сделать.Ответы:
Не смешивайте порт 443 с SSL! Nginx полностью независим от портов. Вы также можете предложить https через порт 80. Современные версии nginx позволяют
и вам не нужна
ssl on;
линия тогда.Но если вы хотите обслуживать https, вам нужно указать сертификат. Ваш сервер вводит https, когда переписывает запрос http в запрос https.
Вы получаете ОШИБКУ ПРОТОКОЛА, поскольку SSL-рукопожатие выполняется раньше всего. Так
return 444
не дошло. И для любого рукопожатия SSL потребуется сертификат и закрытый ключ, чтобы снабдить алгоритмы шифрования парой сертификат / закрытый ключ.источник
return
Директива является частью модуля перезаписи. Если вы проверите документацию , вы можете увидеть, что она работает с запросами. В HTTPS запросы могут быть сделаны только после того, как рукопожатие было закончено.Есть запрос функции: https://trac.nginx.org/nginx/ticket/195 и решение для обхода проблемы.
источник
proxy_pass
, если вы не установилиproxy_ssl_server_name on;
), доступ к любым другимserver_names
(так что, по сути, нарушите законныеserver_name
s, которые вы действительно хотите пропустить). Для получения подробной информации см. Trac.nginx.org/nginx/ticket/195#comment:11 .