Plusieurs certificats SSL pour différents VirtualHosts sur une seule IP

Dans ce tuto, nous allons voir comment installer 2 certificats SSL différents pour deux virtualhosts différents, sur un serveur debian / apache2 ne disposant que d’une IP.

Pour faire simple, nous envisageons ici le cas de certificats autosignés.
Le principe est le même pour les certificats issus d’une autorité de certification.

Déjà, activons le module ssl  :

a2enmod ssl

On crée un repertoire pour stocker les certificats :

mkdir /etc/ssl/exempleA
cd /etc/ssl/exempleB

On génére la  clé (sans passphrase pour ne pas avoir à la retaper au redémarrage automatique d’apache) :
openssl genrsa -out www.exampleA.com.key 2048
On génère le CSR
openssl req -new -key www.exampleA.com.key -out www.exampleA.com.csr
On génère le certificat
openssl x509 -req -days 365 -in www.exampleA.com.csr -signkey www.exampleA.com.key -out www.exampleA.com.crt

On règle les droits au minimum sur ces fichiers
chmod 600 *

éditer ainsi le VirtualHost du site exempleA

<VirtualHost *:443>
    DocumentRoot /home/exampleA/www
    ServerName www.exampleA.com
        SSLEngine on
        SSLCertificateFile /etc/ssl/exampleA/www.exampleA.com.crt
        SSLCertificateKeyFile /etc/ssl/exampleA/www.exampleA.com.key
        SSLVerifyClient None
        SSLOptions +StdEnvVars
</VirtualHost>

Note : on peut aller beaucoup plus en détail dans la configuration  du Vhost sécurisé, je ne mets ici que les lignes les plus basiques.

On fait la même chose pour le second Vhost :

mkdir /etc/ssl/exempleB
cd /etc/ssl/exempleB
openssl genrsa -out exempleB.key 2048
openssl req -new -key exempleB.key -out exempleB.csr
openssl x509 -req -days 365 -in exempleB.csr -signkey exempleB.key -out exempleB.crt

<VirtualHost *:443>
    DocumentRoot /home/exampleB/www
    ServerName www.exampleB.com
        SSLEngine on
        SSLCertificateFile /etc/ssl/exampleB/www.exampleB.com.crt
        SSLCertificateKeyFile /etc/ssl/exampleB/www.exampleB.com.key
        SSLVerifyClient None
        SSLOptions +StdEnvVars
</VirtualHost>

Alors ajoutez dans /etc/apache2/ports.conf

<IfModule mod_ssl.c>
    Listen 443
    NameVirtualHost *:443
</IfModule>

Si vous obtenez le message d’erreur suivant au redémarrage d’apache :
« [warn] _default_ VirtualHost overlap on port 443, the first has precedence »
C’est que vous avez fait une erreur dans /etc/apache2/ports.conf ou dans un des vhosts.

Si vous obtenez le message d’erreur suivant au redémarrage d’apache :
« Restarting web server: apache2 … waiting (98)Address already in use: make_sock: could not bind to address [::]:443 »

C’est que vous avez activé gnutls. (ce qui active donc 2 fois le Listen 443 dans ports.conf)
Donc désactivez gnutls :
a2dismod gnutls

Méfiez-vous car la commande ‘apache2ctl -t’ ne signalera pas d’erreur.

Si tout est ok, lorsque vous visitez https://www.exampleA.com et https://www.exampleB.com vous obtenez bien 2 certificats différents
(Dans notre cas, en raison des certificats autosignés, vous devrez ajouter deux exceptions de sécurité dans votre navigateur)

Publié dans Gnu / Linux
9 commentaires sur “Plusieurs certificats SSL pour différents VirtualHosts sur une seule IP
  1. oxoljo dit :

    Bonjour et merci pour votre doc.

    Pouvez-vous me dire où vous mettez la conf de chaque virtual host?

    Je n’utilise pas d’habitude les virtual host .

    J’ai mes conf dans sites-enabled

    Merci.

    • Sebastien dit :

      On doit créer 1 fichier par virtual host dans /etc/apache2/sites-available
      Ensuite on active chaque virtual par la commande a2ensite « nomdufichier »
      Cela créera le lien symbolique dans /etc/apache2/site-enabled

  2. TFRICHET dit :

    Énorme merci !

    Il me manquait également le « NameVirtualHost *:443 » dans ports.conf

  3. DE BIASIO dit :

    Merci. J’étais dans un cas d’ajout de sous-domaine test sur un domaine principal déjà équipé d’un certificat GeoTrust. Les commandes de regénération d’un certificat autosigné affecté au sous-domaine m’ont bien aidé.
    Au plaisir

  4. François dit :

    Je plussoie :-)
    Mille mercis pour ce post qui m’a bien dépanné face à un problème qui devenait de plus en plus nébuleux à mes yeux.

  5. ancium dit :

    Pour le second Vhost, dans la balise il faut sans doute remplacer A par B.
    Sinon pour moi ça na marche pas. A fonctionne. Pas de message d’erreur, mais quand je pointe sur B, il me redirige sur A qui est la racine de mon site.
    Merci et bonne continuation

  6. chvz dit :

    Merci pour ce billet qui m’a dépanné alors que je ne saisissais pas trop le soucis rencontré dans mon cas de figure.

    Bonne continuation à vous.

  7. Guillaume dit :

    Pile poile ce que je cherchais, merci.. Il me manquait le NameVirtualHost *:443 dans le ports.conf

Répondre à DE BIASIO Annuler la réponse

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*