Назад | Перейти на главную страницу

nginx SSL с пустым доменом и подстановочным знаком

Это неприятная проблема, и я надеюсь, что кто-нибудь сможет мне помочь.

Для начала у меня есть собственный центр сертификации, поэтому я делаю самозаверяющие сертификаты; Я могу делать с ними все, что мне нужно, используя openssl.

У меня есть домен example.com и веб-сервер, на котором запущен nginx, и я пытаюсь настроить ситуацию так, чтобы перенаправить:

http://example.com -> http://www.example.com 

и

httpS://example.com -> httpS://www.example.com

Моя проблема не в том, чтобы заставить nginx делать то, что мне нужно; это так, либо с перезаписью, либо с перенаправлением. В настоящее время у меня есть единственный серверный блок с переписанным if для простоты (да, если это зло, я знаю!). Моя проблема - это сертификат SSL.

Если я создаю обычный однодоменный сертификат для «example.com», я получаю ошибку сертификата с «www.example.com». Хорошо, я сделаю подстановочный знак для "* .example.com"! Только вот теперь я получаю ошибку сертификата для пустого домена. Для меня причины этого имеют смысл, но я все же хочу объединить их в один сертификат и один серверный блок nginx, если это возможно. Итак, я попытался создать CSR с subjectAltName «DNS: example.com, DNS: *. Example.com». Но, похоже, это тоже не работает: пустой домен работает и перенаправляет, но затем, как только я обновляюсь, я получаю странную ошибку сертификата, в которой говорится, что «сертификат действителен только для example.com», а при проверке CN означает "* .example.com".

Может ли кто-нибудь дать совет, как решить эту проблему и как можно проще создать полный набор перенаправлений?

И да, я знаю, что могу просто проигнорировать https://example.com вообще, и слушайте только SSL на www.example.com, но перфекционист во мне не позволяет этого; Я хочу, чтобы все на этом сайте было полностью независимым от SSL и работало точно так же, с ним или без него, даже с этим начальным перенаправлением!

Изменить: конфигурация nginx:

server {
    listen                          80;
    listen                          [::]:80;
    listen                          443 ssl;
    listen                          [::]:443 ssl;
    root                            /var/www/example.com;
    index                           index.html index.htm;
    server_name                     www.example.com example.com;

    ssl_certificate                 /etc/ssl/sites/example.com.crt;
    ssl_certificate_key             /etc/ssl/sites/example.com.key;
    ssl_session_timeout             5m;
    ssl_protocols                   SSLv3 TLSv1;
    ssl_ciphers                     ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;
    ssl_prefer_server_ciphers       on;

    if ($http_host != "www*") {
             rewrite ^ $scheme://www.$http_host$request_uri permanent;
    }

    location / {
            try_files $uri $uri/ /index.html;
    }
}

Функциональность X.509, которую вы ищете, называется альтернативным именем субъекта (или SAN).

Вы можете прочитать больше об этом здесь: http://en.wikipedia.org/wiki/SubjectAltName

Вы можете прочитать о создании сертификата с этим свойством здесь: https://library.linode.com/security/ssl-certificates/subject-alternate-names

Вот руководство по настройке сертификатов nginx и SAN: http://blog.simplytestable.com/using-a-multiple-domain-ucc-secure-certificate-with-nginx/