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)
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.
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
Énorme merci !
Il me manquait également le « NameVirtualHost *:443 » dans ports.conf
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
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.
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
merci pour votre message, j’ai corrigé le post.
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.
Pile poile ce que je cherchais, merci.. Il me manquait le NameVirtualHost *:443 dans le ports.conf