110 votes

Plusieurs domaines SSL sur la même adresse IP et le même port ?

Ceci est une Question Canonique sur l'hébergement de plusieurs sites Web SSL sur la même IP.

J'étais sous l'impression que chaque certificat SSL nécessitait sa propre combinaison unique d'adresse IP/Port. Mais la réponse à une question précédente que j'ai posée va à l'encontre de cette affirmation.

En utilisant les informations de cette question, j'ai réussi à faire fonctionner plusieurs certificats SSL sur la même adresse IP et sur le port 443. Je suis très confus quant à savoir pourquoi cela fonctionne, étant donné l'hypothèse ci-dessus et renforcée par d'autres, que chaque site Web SSL sur le même serveur nécessite sa propre IP/Port.

Je soupçonne d'avoir fait quelque chose de mal. Est-il possible d'utiliser plusieurs certificats SSL de cette manière ?

0 votes

Cette question mentionne plusieurs certificats et les réponses sont correctes à ce sujet. Cependant, le titre parle de plusieurs domaines et vous pouvez avoir plusieurs domaines avec un seul certificat (et sans SNI), voir serverfault.com/questions/126072/… et serverfault.com/questions/279722/… également sur security.SX.

97voto

Michael Hampton Points 232226

Oui, mais il y a quelques réserves.

Cela est accompli grâce à l'indication du nom du serveur, une extension à la sécurité de la couche de transport.

Qu'est-ce que l'indication du nom du serveur ?

Indication de nom de serveur (RFC 6066 ; obsolète RFC 4366 , RFC 3546) est une extension de la sécurité de la couche de transport qui permet au client de dire au serveur le nom de l'hôte qu'il essaie d'atteindre.

L'ISN est compatible avec TLS 1.0 et supérieur selon la spécification, mais les implémentations peuvent varier (voir ci-dessous). Il ne peut pas être utilisé avec SSL, donc une connexion doit négocier TLS (voir RFC 4346 annexe E) pour que l'ISN soit utilisé. Cela se fait généralement automatiquement avec les logiciels pris en charge.

Pourquoi l'ISN est-il nécessaire ?

Dans une connexion HTTP normale, le navigateur informe le serveur du nom d'hôte du serveur qu'il essaie d'atteindre en utilisant l'en-tête Host:. Cela permet à un serveur Web sur une seule adresse IP de servir du contenu pour plusieurs noms d'hôte, ce qui est communément appelé l'hébergement virtuel basé sur le nom.

L'alternative consiste à attribuer des adresses IP uniques à chaque nom d'hôte Web à servir. Cela était couramment pratiqué au tout début du Web, avant qu'il ne soit largement connu que les adresses IP seraient épuisées et que des mesures de conservation aient commencé, et se fait toujours ainsi pour les hôtes virtuels SSL (sans utiliser l'ISN).

Parce que cette méthode de transmettre le nom d'hôte nécessite que la connexion soit déjà établie, elle ne fonctionne pas avec les connexions SSL/TLS. Au moment où la connexion sécurisée est établie, le serveur Web doit déjà savoir quel nom d'hôte il va servir au client, car le serveur Web lui-même met en place la connexion sécurisée.

L'ISN résout ce problème en permettant au client de transmettre le nom d'hôte dans le cadre de la négociation TLS, de sorte que le serveur soit déjà conscient de quel hôte virtuel doit être utilisé pour répondre à la connexion. Le serveur peut alors utiliser le certificat et la configuration du bon hôte virtuel.

Pourquoi ne pas utiliser des adresses IP différentes ?

L'en-tête HTTP Host: a été défini pour permettre à plus d'un hôte Web d'être servi à partir d'une seule adresse IP en raison de la pénurie d'adresses IPv4, reconnue comme un problème dès le milieu des années 1990. Dans les environnements d'hébergement Web partagés, des centaines de sites We

......

(Note : Certaines informations pour cette réponse ont été obtenues sur Wikipédia.)

1 votes

Beaucoup mieux :-) Espérons que cela obtienne éventuellement un score plus élevé que celui actuellement accepté, qui, à part la dernière modification en haut, est malheureusement surtout incorrect.

1 votes

@Bruno je ne vais certainement pas me plaindre si vous trouvez quelques centaines de personnes pour voter à la hausse. :)

0 votes

Le dernier navigateur BlackBerry (10?) utilise une version récente de WebKit, il est donc très probable qu'il prend en charge maintenant SNI.

68voto

voretaq7 Points 78924

Pour les informations les plus à jour sur Apache et SNI, y compris les RFC spécifiques à HTTP supplémentaires, veuillez consulter le Wiki Apache


FYsI : "Plusieurs certificats SSL (différents) sur une IP" vous est présenté grâce à la magie de la mise à niveau TLS. Ça fonctionne avec les serveurs Apache plus récents (2.2.x) et les navigateurs raisonnablement récents (je ne connais pas les versions exactes).

La RFC 2817 (mise à niveau vers TLS dans HTTP/1.1) contient les détails, mais fondamentalement, cela fonctionne pour beaucoup de gens (si ce n'est pas la majorité).
Vous pouvez reproduire l'ancien comportement bizarre avec la commande s_client d'openssl (ou avec tout navigateur "assez ancien").

Édition pour ajouter : apparemment, curl peut vous montrer ce qui se passe ici mieux qu'openssl :


SSLv3

mikeg@flexo% curl -v -v -v -3 https://www.yummyskin.com
* Connexion à www.yummyskin.com à la port 443 (#0)
*   Tentative 69.164.214.79... connecté
* Connecté à www.yummyskin.com (69.164.214.79) port 443 (#0)
* Configuration des emplacements de vérification des certificats réussie :
*   Fichier CA : /usr/local/share/certs/ca-root-nss.crt
  Chemin du CA : aucun
* SSLv3, poignée de main TLS, Bonjour client (1):
* SSLv3, poignée de main TLS, Bonjour serveur (2):
* SSLv3, poignée de main TLS, CERT (11):
* SSLv3, poignée de main TLS, Échange de clés serveur (12):
* SSLv3, poignée de main TLS, Terminé serveur (14):
* SSLv3, poignée de main TLS, Échange de clés client (16):
* SSLv3, modification de la suite de chiffrement TLS, Bonjour client (1):
* SSLv3, poignée de main TLS, Terminé (20):
* SSLv3, modification de la suite de chiffrement TLS, Bonjour client (1):
* SSLv3, poignée de main TLS, Terminé (20):
* Connexion SSL utilisant DHE-RSA-AES256-SHA
* Certificat du serveur :
*    sujet : numéro de série=wq8O9mhOSp9fY9JcmaJUrFNWWrANURzJ; C=CA; 
              O=staging.bossystem.org; OU=GT07932874;
              OU=Voir www.rapidssl.com/resources/cps (c)10;
              OU=Validation de contrôle de domaine - RapidSSL(R);
              CN=staging.bossystem.org
*    date de début : 2010-02-03 18:53:53 GMT
*    date d'expiration : 2011-02-06 13:21:08 GMT
* SSL : le nom du sujet du certificat 'staging.bossystem.org'
       ne correspond pas au nom de l'hôte cible 'www.yummyskin.com'
* Fermeture de la connexion #0
* SSLv3, alerter TLS, Bonjour client (1):
curl: (51) SSL : le nom du sujet du certificat 'staging.bossystem.org'
ne correspond pas au nom de l'hôte cible 'www.yummyskin.com'

TLSv1

mikeg@flexo% curl -v -v -v -1 https://www.yummyskin.com
* Connexion à www.yummyskin.com à la port 443 (#0)
*   Tentative 69.164.214.79... connecté
* Connecté à www.yummyskin.com (69.164.214.79) port 443 (#0)
* Configuration des emplacements de vérification des certificats réussie :
*   Fichier CA : /usr/local/share/certs/ca-root-nss.crt
  Chemin du CA : aucun
* SSLv3, poignée de main TLS, Bonjour client (1):
* SSLv3, poignée de main TLS, Bonjour serveur (2):
* SSLv3, poignée de main TLS, CERT (11):
* SSLv3, poignée de main TLS, Échange de clés serveur (12):
* SSLv3, poignée de main TLS, Terminé serveur (14):
* SSLv3, poignée de main TLS, Échange de clés client (16):
* SSLv3, modification de la suite de chiffrement TLS, Bonjour client (1):
* SSLv3, poignée de main TLS, Terminé (20):
* SSLv3, modification de la suite de chiffrement TLS, Bonjour client (1):
* SSLv3, poignée de main TLS, Terminé (20):
* Connexion SSL utilisant DHE-RSA-AES256-SHA
* Certificat du serveur :
*    sujet : C=CA; O=www.yummyskin.com; OU=GT13670640;
              OU=Voir www.rapidssl.com/resources/cps (c)09;
              OU=Validation de contrôle de domaine - RapidSSL(R);
              CN=www.yummyskin.com
*    date de début : 2009-04-24 15:48:15 GMT
*    date d'expiration : 2010-04-25 15:48:15 GMT
*    nom commun : www.yummyskin.com (correspondant)
*    émetteur : C=US; O=Equifax Secure Inc.; CN=Equifax Secure Global eBusiness CA-1
*    Vérification du certificat SSL réussie.

2 votes

C'est très utile -- Merci! Des informations sur la configuration d'Apache pour TLS au lieu de SSL?

2 votes

Je pense que Apache 2.2 a juste besoin d'avoir les bits TLS activés dans sa liste de chiffrement. J'avoue que je n'ai jamais vu le "Passage de SSL à TLS" en action jusqu'à ces deux sites cependant. Ma compréhension des docs de TLS est qu'il est possible (mais inhabituel) de négocier ce type de mise à niveau...

0 votes

C'est la première fois que je vois ça et j'essaie toujours de reprendre mes esprits...

37voto

Kenny Rasschaert Points 8737

Le problème :

Lorsqu'un client web et un serveur web communiquent entre eux via HTTPS, la première chose qui doit se produire est l'authentification sécurisée.

Voici un exemple simplifié d'une telle authentification :

tls handshake

S'il s'agissait de HTTP et non pas de HTTPS, la première chose que le client aurait envoyée aurait été quelque chose comme ceci :

GET /index.html HTTP/1.1
Host: example.com

Cela a permis aux hôtes virtuels multiples sur une seule adresse IP, car le serveur sait exactement quel domaine le client souhaite accéder, à savoir example.com.

HTTPS est différent. Comme je l'ai mentionné précédemment, l'authentification se produit avant tout le reste. Si vous regardez la troisième étape de l'authentification illustrée ci-dessus (Certificat), le serveur doit présenter un certificat au client dans le cadre de l'authentification, mais n'a aucune idée du nom de domaine auquel le client essaie d'accéder. La seule option dont dispose le serveur est d'envoyer le même certificat à chaque fois, son certificat par défaut.

Vous pouvez toujours configurer des hôtes virtuels sur votre serveur web, mais le serveur enverrait toujours le même certificat à chaque client. Si vous essayiez d'héberger à la fois les sites example.com et example.org sur votre serveur, le serveur enverrait toujours le certificat pour example.com lorsque qu'un client demande une connexion HTTPS. Donc, lorsque qu'un client demande example.org sur une connexion HTTPS établie, cela arriverait :

enter image description here

Ce problème limite efficacement le nombre de domaines que vous pouvez héberger via HTTPS à un par adresse IP.

La solution :

La manière la plus simple de résoudre ce problème est pour le client d'indiquer au serveur quel domaine il souhaite accéder pendant l'authentification. De cette façon, le serveur peut fournir le certificat correct.

C'est exactement ce que SNI, ou Server Name Indication fait.

Avec SNI, le client envoie le nom de serveur qu'il veut accéder dans le premier message, l'étape "Client Hello" dans le diagramme d'authentification ci-dessus.

Certains anciens navigateurs web ne supportent pas SNI. Par exemple, sur Windows XP, il n'existe pas une seule version d'Internet Explorer qui prend en charge SNI. Lors de l'accès à une ressource via HTTPS sur un serveur qui utilise des hôtes virtuels SNI, vous verrez un certificat générique, ce qui peut entraîner l'affichage d'un avertissement ou d'une erreur par le navigateur.

enter image description here

J'ai simplifié les choses ici pour expliquer simplement le principe du problème et de la solution. Si vous souhaitez une explication plus technique, la page wikipedia ou RFC 6066 pourraient être de bons points de départ. Vous pouvez également trouver une liste à jour des serveurs et navigateurs prenant en charge SNI sur wikipedia

16voto

Moriarty Points 821

http://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI

Le navigateur client doit également prendre en charge SNI. Voici quelques navigateurs qui le font:

* Mozilla Firefox 2.0 ou ultérieur
* Opera 8.0 ou ultérieur (avec TLS 1.1 activé)
* Internet Explorer 7.0 ou ultérieur (sur Vista, pas sur XP)
* Google Chrome
* Safari 3.2.1 sur Mac OS X 10.5.6

6voto

Falcon Momot Points 24815

L'extension TLS Server Name Indication (RFC6066) est requise pour que les hôtes virtuels basés sur des noms fonctionnent via HTTPS.

L'extension est largement mise en œuvre et je n'ai pas encore rencontré de problèmes avec les logiciels actuels, mais il existe une possibilité que certains clients (ceux ne la prenant pas en charge) soient dirigés vers votre site par défaut si vous dépendez du SNI.

0 votes

En plus de la réponse de Falcon, IIS nécessite également quelques changements spéciaux pour faire fonctionner plusieurs sites IIS sur la même IP. Vous devez modifier manuellement le fichier de configuration du serveur ou utiliser un outil CLI pour apporter les modifications de liaison, l'outil GUI ne peut pas le faire. Dans IIS, il est question d'attribuer des certificats SSL aux en-têtes d'hôte. Apache n'a pas eu ce problème depuis un certain temps.

0 votes

Ah d'accord, cela éclaircit certaines choses. Comment pouvez-vous savoir si un client (navigateur) prend en charge cela ? Par exemple, si je veux vérifier MSIE6, comment puis-je le tester sans avoir à installer une machine virtuelle XP ou autre ?

1 votes

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X