Utiliser plusieurs certificats SSL sur un seul serveur apache

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 :


    NameVirtualHost *:443
    Listen 443

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).


   ServerName blog.gaetan-grigis.eu
   DocumentRoot /var/www/blog
   SSLEngine on
   SSLProtocol all -SSLv2
   SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM

   SSLCertificateFile /etc/apache2/cert/blog.crt
   SSLCertificateKeyFile /etc/apache2/cert/blog.key
   SSLCertificateChainFile /etc/apache2/cert/sub.class1.server.ca.crt
   SSLCACertificateFile /etc/apache2/cert/ca.crt
   SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
   CustomLog /var/log/apache2/ssl_request.log \
      "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"


   ServerName un-autre-sous-domaine.gaetan-grigis.eu
   DocumentRoot /var/www/un-autre-sous-domaine
   SSLEngine on
   SSLProtocol all -SSLv2
   SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM

   SSLCertificateFile /etc/apache2/cert/un-autre-sous-domaine.crt
   SSLCertificateKeyFile /etc/apache2/cert/un-autre-sous-domaine.key
   SSLCertificateChainFile /etc/apache2/cert/sub.class1.server.ca.crt
   SSLCACertificateFile /etc/apache2/cert/ca.crt
   SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
   CustomLog /var/log/apache2/ssl_request.log \
      "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

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. 😉

9 réflexions sur « Utiliser plusieurs certificats SSL sur un seul serveur apache »

  1. 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. 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. 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. 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. 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.

  6. Salut,

    Oui, cet article est vieux, mais intéressant tout de même 🙂

    Je suis sous debian lenny, depuis quasiment 3 ans (mon serveur); et apache -v me renvoie :

    Server version: Apache/2.2.9 (Debian)
    Server built: Feb 5 2012 21:06:22

    et openssl version renvoie « OpenSSL 0.9.8g 19 Oct 2007 »

    J’ai un certificat auto-signé que j’utilise depuis tout ce temps, pour deux sous-domaines (un webftp, et phpmyadmin), et ce sans aucun problème, après avoir accepté l’exception de sécurité, évidemment.

    Donc je ne comprends pas, il faut avoir une version au moins 2.2.12, mais ça marche avec 2.2.9 ?

    Je précise que je n’ai qu’une seule IP !!

    Merci beaucoup pour l’article, je me demandais justement si j’allais pouvoir avoir un certificat startSSL pour chaque (sous-)domaine !

    Gaël

Les commentaires sont fermés.