Wiele vhostów SSL przy użyciu certyfikatu wieloznacznego w nginx

14

Mam dwie nazwy hosta o tej samej nazwie domeny, którą chcę obsługiwać przez HTTPs. Mam certyfikat wildcard-SSL i utworzyłem dwie konfiguracje vhost:

Host A

listen      127.0.0.1:443 ssl;
server_name     a.example.com;
root        /data/httpd/a.example.com;
ssl_certificate /etc/ssl/wildcard.cer;
ssl_certificate_key /etc/ssl/wildcard.key;

Host B

listen      127.0.0.1:443 ssl;
server_name     b.example.com;
root        /data/httpd/b.example.com;
ssl_certificate /etc/ssl/wildcard.cer;
ssl_certificate_key /etc/ssl/wildcard.key;

Dostaję jednak ten sam vhost, który jest obsługiwany dla dowolnej nazwy hosta.

vincent.io
źródło

Odpowiedzi:

17

Musisz podzielić vhosty z części nasłuchiwania / konfiguracji ssl:

Część słuchania:

server {
  listen              127.0.0.1:443 default_server ssl;
  server_name         _;
  ssl_certificate     /etc/ssl/wildcard.cer;
  ssl_certificate_key /etc/ssl/wildcard.key;
}

A teraz vhosty:

server {
  listen      127.0.0.1:443;
  server_name a.example.com;
  root        /data/httpd/a.example.com;
}

server {
  listen      127.0.0.1:443;
  server_name b.example.com;
  root        /data/httpd/b.example.com;
}
Teftin
źródło
To by nie działało. A potrzeby vhosta ssl_certificatei ssl_certificate_keyktóre powinny zostać skonfigurowane wewnątrz serverlub httplokalizację. W twoim przykładzie zadeklarowałeś go w pierwszej serverlokalizacji, ale nie zadeklarowałeś go dla dwóch pozostałych vhostów.
Pothi Kalimuthu
2
to wystarczy, aby skonfigurować ssl_certificate, ssl_certificate_keya sslna default_server tylko. BTW, ta konfiguracja faktycznie działa.
Teftin
Niestety to nie działa: nginx obsługuje tę samą zawartość vhost na obu hostach.
vincent.io
2
Najwyraźniej musisz ponownie uruchomić nginx zamiast przeładowywać go podczas wykonywania tych zmian. Wielkie dzięki, twoja odpowiedź działa jak urok :)
vincent.io
1
Dzięki za to, potrzebowałem sslna listendyrektywie dla tej pracy z nginx 1.4.x. Moje listendyrektywy w vhostach również musiały być dosłownie takie same (logiczna równoważność nie była wystarczająca).
Dave S.
13

W rzeczywistości jest to wyjaśnione w instrukcji: http://nginx.org/en/docs/http/configuring_https_servers.html#certificate_with_several_names

ssl_certificate /etc/ssl/wildcard.cer;
ssl_certificate_key /etc/ssl/wildcard.key;
server {
  listen      443 ssl;
  server_name a.example.com;
  root        /data/httpd/a.example.com;
}
server {
  listen      443 ssl;
  server_name b.example.com;
  root        /data/httpd/b.example.com;
}

Teraz, jeśli masz wiele witryn, sugeruję przechowywanie ich wszystkich w folderze zawierającym tylko część serwera {} jak wyżej w pojedynczych plikach oraz dyrektywę dołączania w pliku głównym, aby załadować wszystkie:

ssl_certificate /etc/ssl/wildcard.cer;
ssl_certificate_key /etc/ssl/wildcard.key;
include /etc/nginx/conf.d/subfolder/*;
BxlSofty
źródło