Utiliser plusieurs certificats SSL sur un seul serveur apache

1 mai 2010 par Gaëtan Laisser une réponse »

Plop à tous …

Le but de l’article du jour est d’utiliser plusieurs certificats SSL sur une même machine via le SNI (ce qui était impossible il y a quelques années de cela cf. wikipedia, le premier patch étant sorti en 2004, les premières implémentation sur les serveurs apache se sont fait sur la version 2.2.12 en Juillet 2009).

Depuis peu donc, on peut s’amuser à installer plusieurs certificats SSL, mais ça nécessite un tout petit peu de configuration (vraiment un tout petit peu en fait).

Les outils nécessaire :

  • Des certificats SSL (de préférences valide c’est gratos chez startSSL)
  • Un serveur apache de version 2.2.12 ou supérieur
  • La librairie openssl 0.9.8j ou supérieur

La configuration niveau apache (il faut bien entendu avoir activer le mod ssl), et copier les fichiers crt et key que vous on fournit vos fournisseurs de certificats sur le serveur dans un dossier accessible à apache (chez moi /etc/apache2/cert/).

il faut modifier la config « /etc/apache2/ports.conf » et faire en sorte que le ifmodule du mod_ssl ressemble à ça :

  1. <IfModule mod_ssl.c>
  2.     NameVirtualHost *:443
  3.     Listen 443
  4. </IfModule>

Généralement, le NameVirtualHost n’est pas mis dans la configuration par défaut, il faut donc le rajouter.

Puis enfin créer le fichier de configuration s’occupant de vos certificats et de les servir suivant le nom de domaine demandé (chez moi blog.gaetan-grigis.eu et un-autre-sous-domaine.gaetan-grigis.eu).

  1. <VirtualHost *:443>
  2.    ServerName blog.gaetan-grigis.eu
  3.    DocumentRoot /var/www/blog
  4.    SSLEngine on
  5.    SSLProtocol all -SSLv2
  6.    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM
  7.  
  8.    SSLCertificateFile /etc/apache2/cert/blog.crt
  9.    SSLCertificateKeyFile /etc/apache2/cert/blog.key
  10.    SSLCertificateChainFile /etc/apache2/cert/sub.class1.server.ca.crt
  11.    SSLCACertificateFile /etc/apache2/cert/ca.crt
  12.    SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
  13.    CustomLog /var/log/apache2/ssl_request.log \
  14.       "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
  15. </VirtualHost>
  16. <VirtualHost *:443>
  17.    ServerName un-autre-sous-domaine.gaetan-grigis.eu
  18.    DocumentRoot /var/www/un-autre-sous-domaine
  19.    SSLEngine on
  20.    SSLProtocol all -SSLv2
  21.    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM
  22.  
  23.    SSLCertificateFile /etc/apache2/cert/un-autre-sous-domaine.crt
  24.    SSLCertificateKeyFile /etc/apache2/cert/un-autre-sous-domaine.key
  25.    SSLCertificateChainFile /etc/apache2/cert/sub.class1.server.ca.crt
  26.    SSLCACertificateFile /etc/apache2/cert/ca.crt
  27.    SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
  28.    CustomLog /var/log/apache2/ssl_request.log \
  29.       "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
  30. </VirtualHost>

Et voilà, si vous avez utilisé StartSSL, vous avez accès à deux sous-domaines différents avec des certificats valide différent sur une seule et même machine … elle est pas belle la vie ?? (La vie d’un geek est passionnante en effet ;) ).

PS : On peut bien sûr en créer autant qu’on veut, c’est pas limité à deux sous-domaines. ;)

Publicité

7 commentaires

  1. Kurt dit :

    Salut,

    Merci pour le tuto, j’ai un soucis quand j’ajoute un autre sous domaine, j’ai un conflit de port « [warn] Init: SSL server IP/port conflict: sd1.domaine.com:443 vs. sd2.domaine.com:443″

    Je sais pas si tu pourrais m’aider. Merci.

  2. Gaëtan dit :

    Y aurait-il moyen d’avoir plus d’information sur la configuration utilisée ? Vous utilisez bien la dernière version d’apache (supportant le SNI) ??

  3. Laurent dit :

    Du fait de la façon dont SSL + HTTPS fonctionne,
    cette solution ne fonctionne que si blog.gaetan-grigis.eu et un-autre-sous-domaine.gaetan-grigis.eu sont sur deux IP différentes.
    Si les deux sous-domaines sont sous la même IP, un seul certificat SSL pouvant sécuriser les deux sous-domaine doit être utilisé (certificat SSL Wildcard ou certificat SSL Unified Communications)

  4. Gaëtan dit :

    Justement, grâce au SNI, on peut utiliser plusieurs certificats SSL sur un même serveur et une même ip (cf. les liens de l’article sur le SNI), mais comme décrit dans l’article, il faut utiliser l’une des dernières version d’apache et d’openssl (qui jusque là ne sont pas dans la dernière stable de debian).

  5. ROGER dit :

    test (la dernière fois ça a buggué)

  6. ROGER dit :

    A noté que cette technique ne peut fonctionner qu’avec les navigateurs récent. IE6 est exclu.

    En effet, le navigateur doit, lors de la tentative de récupération du certificat, indiquer à apache l’url qu’il souhaite visiter.

    Les anciens navigateurs ne précisent pas cette information. Le certificat retourné doit donc être valide pour l’ensemble des sites hébergés sur le serveur.

Laisser un commentaire