web-dev-qa-db-fra.com

nginx - définir plusieurs nom_serveur avec le support ssl

J'aimerais utiliser nginx pour servir un site Web avec plusieurs noms de domaine et SSL:

  • webmail.example.com
  • webmail.beispiel.de

Les deux utilisent le même vhost, je n'ai donc défini le nom_serveur que deux fois. Le problème est que j'ai besoin de nginx pour servir le certificat SSL correct pour chaque nom de domaine.

Est-ce possible avec un vhost ou dois-je configurer deux vhosts?

40
PascalTurbo

Edit novembre 2014 : la réponse initiale n'est pas correcte et est incomplète; il fallait un rafraîchissement! C'est ici.

Fondamentalement, il y a deux cas

- Vous possédez un certificat générique (ou un certificat multi-domaines)

Dans ce cas, vous pouvez utiliser plusieurs vhosts écoutant la même adresse IP/port https, et les deux vhosts utiliser le même certificat (écouter sur toutes les interfaces) , par exemple.

server {
  listen 443;
  server_name webmail.example.com;
  root /var/www/html/docs/sslexampledata;

  ssl on;
  ssl_certificate /var/www/ssl/samecertif.crt;
  ssl_certificate_key /var/www/ssl/samecertif.key;
  ...
}


server {
  listen 443;
  server_name webmail.beispiel.de;
  root /var/www/html/docs/sslbeispieldata;

  ssl on;
  ssl_certificate /var/www/ssl/samecertif.crt;
  ssl_certificate_key /var/www/ssl/samecertif.key;
  ...
}

ou dans votre cas spécifique, avoir les deux domaines servis par les mêmes données

server {
  listen 443;
  server_name webmail.example.com webmail.beispiel.de; # <== 2 domains
  root /var/www/html/docs/sslbeispieldata;

  ssl on;
  ssl_certificate /var/www/ssl/samecertif.crt;
  ssl_certificate_key /var/www/ssl/samecertif.key;
  ...
}



- Vous avez deux (+) certificats différents

Le cas ci-dessus (une IP pour tous les certificats) fonctionnera toujours avec les navigateurs modernes via l'indication du nom du serveur. SNI demande au client (navigateur) d'envoyer l'hôte qu'il souhaite atteindre dans l'en-tête de la demande, ce qui permet au serveur (nginx) de traiter vhosts avant d'avoir à traiter le certificat. La configuration est la même que ci-dessus, sauf que chaque vhost possède un certificat spécifique, crt et key.

( nginx prend en charge SNI à partir de 0.9.8f, vérifiez que votre serveur nginx est compatible SNI )
( aussi, SF parle de SNI et du support du navigateur )

Sinon, si vous souhaitez également atteindre des navigateurs plus anciens, vous avez besoin de plusieurs - vhosts écoutant chacun un différent adresses IP/ports https, par ex.

server {
  listen 1.2.3.4:443; # <== IP 1.2.3.4
  server_name webmail.example.com;
  root /var/www/html/docs/sslexampledata;

  ssl on;
  ssl_certificate /var/www/ssl/certifIP1example.crt;
  ssl_certificate_key /var/www/ssl/certifIP1example.key;
  ...
}


server {
  listen 101.102.103:443; <== different IP
  server_name webmail.beispiel.de;
  root /var/www/html/docs/sslbeispieldata;

  ssl on;
  ssl_certificate /var/www/ssl/certifIP2beispiel.crt;
  ssl_certificate_key /var/www/ssl/certifIP2beispiel.key;
  ...
}

La raison est bien expliquée ici .

45
Ring Ø