Plusieurs vhosts SSL utilisant un certificat générique dans nginx

14

J'ai deux noms d'hôtes partageant le même nom de domaine que je souhaite servir sur HTTP. J'ai un certificat SSL générique et j'ai créé deux configurations vhost:

Hôte 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;

Hôte 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;

Cependant, je reçois le même vhost servi pour chaque nom d'hôte.

vincent.io
la source

Réponses:

17

Vous devez séparer les vhosts de la partie écoute / configuration ssl:

Partie écoute:

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;
}

Et maintenant vhosts:

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
la source
Ça ne marcherait pas. Un vhost a besoin ssl_certificateet ssl_certificate_keydoit être configuré à l'intérieur serverou à l' httpemplacement. Dans votre exemple, vous l'avez déclaré dans le premier serveremplacement, mais ne l' avez pas déclaré pour les deux autres vhosts.
Pothi Kalimuthu
2
il suffit de configurer ssl_certificate, ssl_certificate_keyet sslsur default_server uniquement. BTW, cette configuration fonctionne réellement.
Teftin
Malheureusement, cela ne fonctionne pas: nginx sert le même contenu vhost sur les deux hôtes.
vincent.io
2
Apparemment, vous devez redémarrer nginx au lieu de le recharger lorsque vous effectuez ces modifications. Merci beaucoup, votre réponse fonctionne comme un charme :)
vincent.io
1
Merci pour cela, j'avais besoin sslde la listendirective pour que cela fonctionne avec un nginx 1.4.x. Mes listendirectives dans les vhosts devaient également être littéralement les mêmes (l'équivalence logique n'était pas suffisante).
Dave S.19
13

Il est en fait expliqué dans le manuel: 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;
}

Maintenant, si vous avez plusieurs sites, je suggère de les stocker tous dans un dossier avec juste la partie serveur {} comme ci-dessus dans des fichiers uniques, et une directive include dans le fichier principal pour les charger tous:

ssl_certificate /etc/ssl/wildcard.cer;
ssl_certificate_key /etc/ssl/wildcard.key;
include /etc/nginx/conf.d/subfolder/*;
BxlSofty
la source