Nginx with SSL - andyceo/documentation GitHub Wiki
Эта статья предполагает, что у вас уже есть SSL-сертификат. Если у вас его нет и вы не знаете как его получить или что это такое, см. статью SSL.
См. как сделана роль andyceo.nginx, а конкретно шаблон nginx.vhost.www.ssl.conf.j2
Есть так называемый сервер по умолчанию для порта, например для порта 443. какой бы поддомен ты не набрал через https, запрос придет в этот сервер. и тогда надо либо сказать что такого адреса нет, либо средиректить на главную этого сервера.
Также есть тонкость, если не указываешь 443 ssl;
причем неважно, неправильно ли ты не указал только на одном каком-то сервере (директиве server
) - не работать будут все.
Если ты пишешь в хосте ssl on;
но не указываешь ssl_certificate
- нжинкс не запустится в логах будет:
no "ssl_certificate" is defined for the "ssl" directive in /etc/nginx/sites-enabled/default:25
Если пишешь один сервер, который слушает и 80
, и 443
, и пишешь в нем ssl on;
то будет следующая ошибка в браузере:
400 Bad Request The plain HTTP request was sent to HTTPS port.
Документация:
If HTTP and HTTPS servers are equal, a single server that handles both HTTP and HTTPS requests may be configured by deleting the directive “ssl on” and adding the ssl parameter for *:443 port
Т.е. нельзя использовать ssl on;
в сервере, настроенном на какие-либо еще порты.
Директива listen 443 ssl;
заменяет директиву ssl on;
в этом сервере, т.е. ее можно не писать (а можно и писать, дополнительно).
Ссылки:
- Best nginx configuration for improved security
- Генератор конфигурации SSL для WEB-servers
- Converting rewrite rules
- Let's Encrypt и Nginx
- Install, configure and automatically renew Let's Encrypt SSL certificate (English)
- How to configure HSTS on Nginx
- SPDYCheck.org
...были довольно подробно описаны в статье. Однако, вот еще.
При классической настройке nginx на использование SSL сертификатов, он может падать с ошибкой:
no "ssl_certificate" is defined in server listening on SSL port while SSL handshaking, client:xx.xx.xx.xx, server:0.0.0.0.443
Имейте в виду, при использовании HTTPS, заголовки закодированы, и обмен ключами и слой TLS должны быть сделаны до того, как они смогут быть раскодированы. Другими словами, нет способа для nginx выбрать правильный SSL-блок server до того, как он пошлет SSL-сертификат. Об этом эти ссылки: