У меня есть доменное имя с основным сайтом и несколькими хостами. Я хочу, чтобы все сайты (основной и vhosts) были доступны только через HTTPS (с использованием HSTS), и я хочу, чтобы несуществующие поддомены были перенаправлены на основной сайт.
Подводя итог тому, что я хочу:
Я очень близок к этому, но предпоследнее перенаправление не работает. Я использую сертификат от Давайте зашифровать, который на данный момент не предлагает сертификаты с подстановочными знаками, поэтому сертификат действителен только для основного домена и vhosts (которые я явно указал при создании сертификата). Поскольку сертификат недействителен, браузеры блокируют соединение.
Как лучше всего (если есть) обойти эту проблему?
Вот моя (упрощенная) конфигурация nginx, если это поможет:
server {
listen 80;
server_name _;
return 301 https://example.com$request_uri;
}
server {
listen 443 spdy;
server_name _;
# SSL settings snipped for brevity. SPDY and HSTS are enabled.
return 301 https://example.com$request_uri;
}
server {
listen 443 spdy;
server_name example.com;
root /var/www/example.com;
index index.html index.htm;
}
server {
listen 443 spdy;
server_name vhost.example.com;
root /var/www/vhost.example.com;
index index.html index.htm;
}
На практике проблему невозможно обойти без сертификата с подстановочными знаками. Если вы не можете предоставить сертификат, соответствующий запрошенному имени, вы получите ошибку подключения - это фундаментальная часть протокола.
Я предполагаю, что теоретически вы могли бы написать что-то такое, что, когда он получил заголовок SNI для имени, которого нет в сертификате, выполнил быструю выдачу сертификата от Let's Encrypt и отправил обратно этот новый сертификат в рукопожатии TLS, но. .. ну, это не совсем практичный решение, не так ли?