Sécurisation SSL : Certificat auto-signé multi-sites
S’il est assez facile de mettre plusieurs sites Web sur un seul serveur Apache en http, càd sans sécuriser la connexion, ce l’est nettement moins si l’on désire mettre plusieurs domaines en https sur le même serveur !
Ce billet vous expliquera donc comment gérer plusieurs sites HTTPS sur un serveur Web avec une seul adresse IP.
Cette explication n’est pas propre à une distribution précise, ni même à Linux. Ce pourrait être BSD, Open Solaris ou même … Windows IIS (je suppose). Le certificat généré peut aussi être utilisé sur un autre serveur Web que Apache2.
La sécurisation se fait en créant un certificat SSL (il serait plus exact de dire TLS), que Apache (ou un autre serveur Web) va utiliser pour crypter la connexion https. Ce certificat normalement est propre à UN domaine.
Le problème est simple à comprendre : Apache et votre navigateur Internet cryptent la communication https dés le début, déjà avant même la réception de l’URL par le serveur Apache. La communication doit donc être cryptée avant qu’Apache ne sache par exemple si vous allez demander l’accès au domaine https://www.monsite.be ou https://webmail.monsite.be, ou même un domaine tout à fait différent comme https://www.siteweb2.com
C’est bien ça le problème !
Apache2 est incapable de prendre le bon certificat de cryptage SSL correspondant au site au quel vous désirez accéder car il doit crypter avant de savoir quel sera ce site !
Il est donc nécessaire de ne configurer que UN SEUL certificat SSL valable pour tous vos sites.
On pourrait être tenté d’utiliser des certificats génériques valables par exemple pour “*.monsite.be” ou même “*.*.be” ou “*.*.*”.
D’abord, tous les navigateurs ne se comportent pas de la même façon avec ce genre de certificats, mais de plus cela peut devenir une grosse faille de sécurité ! En effet, si vous englobez un nombre trop grand de domaine (”*.*.be” par exemple pour permettre à la fois “www.monsite.be” et “www.sitepro2.be”), votre certificat restera valable même en cas de redirection vers un site très différent (”www.virus-mechant.be” par exemple), et comme le certificat SSL restera valide pour ce site, vous risquez de ne pas vous appercevoir de la faille de sécurité !
Donc, pas de certificat générique !
La solution est de faire un certificat pour un de vos domaines et d’indiquer dans ce certificat que le domaine a des “noms alternatifs” (comme des alias).
De cette façon, quand votre navigateur fera le contrôle entre le certificat reçu du serveur Web et le domaine qu’il a demandé, ce certificat correspondra bien tant que le nom de domaine demande est dans la liste, qui peut être assez longue, de noms alternatifs.
Jean-Christophe Dubacq a fait un billet expliquant très bien la solution pour obtenir ce certificat multi-domaines.
Je vais me baser sur ce billet et sur le script qu’il a fait, et qui facilite vraiment les choses
Je me connecte (en ssh…) sur le serveur Web en ligne de commande.
Je récupère d’abord le script et le fichier de config :
wget http://jean-christophe.dubacq.fr/public/source/openssl/createkey.sh wget http://jean-christophe.dubacq.fr/public/source/openssl/openssl-conf.cnf
Je dois rendre le script exécutable (pas besoin de le faire en root pour créer le certificat) :
chmod u+x createkey.sh
Il ne reste qu’à l’exécuter et à rentrer vos coordonnées et votre liste de domaines et sous-domaines. Dans mon cas, j’ai un site web et des sous-domaines correspondants à mon blog et à ceux des enfants, ainsi que quelques autres petits sites. N’oubliez PAS la passphrase (sauvez la). En théorie elle est demandée au démarrage d’Apache, mais je pense que le script la supprime ensuite (c’est quand même plus facile si le serveur redémarre sans votre présence) :
./createkey.sh misson.net www.misson.net didier.misson.net katy.misson.net sylvain.misson.net files.misson.net www.nitro-modelisme.be
passphrase? mapassphrasesecrete Generating a 1024 bit RSA private key ..............++++++ ...............++++++ writing new private key to 'privkey.pem' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [FR]:BE Locality Name (eg, city) [Paris]:Bruxelles Organization Name (eg, company) [World Company]:Didier Misson Organizational Unit Name (eg, section) [Internet]:Home Common Name (eg, YOUR name) [test.example.org]:www.misson.net Email Address [root@example.org]:webmaster@misson.net
Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:monchallengepassword An optional company name []:. writing RSA key Signature ok subject=/C=BE/L=Bruxelles/O=Didier Misson/OU=Home/CN=www.misson.net/emailAddress=webmaster@misson.net Getting Private key misson.net.passphrase is the passphrase of your certificate. VERY PRIVATE misson.net.csr is the initial request of your certificate. PUBLIC misson.net.cnf is the extension section of your certificate. PUBLIC misson.net.key is the unprotected key of your certificate. PRIVATE misson.net.pkey is the protected key of your certificate. PRIVATE misson.net.crt is the certificate itself. PUBLIC misson.net.pem is the combined certificate/unprotected key. PRIVATE
Les éléments importants sont la clé privée (.key) et le certificat publique (.crt)
Vérifiez bien les permissions de ces éléments pour que seuls “root” et le userid utilisé par le werveur Web puissent lire ces clés (www-data si c’est Apache2).
sudo chown www-data:www-data misson.net.* sudo chmod 400 misson.net.*
Déplacez ces 2 clés dans le dossier ssl d’Apache2 (vérifiez votre config si vous utilisez un autre serveur Web) :
mv misson.net.crt /etc/apache2/ssl mv misson.net.key /etc/apache2/ssl
Il reste à configurer Apache2 pour utiliser ce certificat pour sécuriser l’accès à un domaine ou un dossier. Ce n’est pas l’objet de ce billet, mais voici un exemple simple :
vi /etc/apache2/sites-available/didier
<VirtualHost didier.misson.net:443> ServerName didier.misson.net DocumentRoot /var/www/didier ErrorLog /var/log/apache2/didier-error_log CustomLog /var/log/apache2/didier-access_log combined SSLEngine on SSLCertificateFile /etc/apache2/ssl/misson.net.crt SSLCertificateKeyFile /etc/apache2/ssl/misson.net.key
...
et évidemment, vérifier qu’il n’y a pas d’erreurs de syntaxe dans la config, et recharger Apache2 :
# apache2 -t Syntax OK
# /etc/init.d/apache2 reload
Voilà, vous avez votre certificat auto-signé, valable pour tous vos domaines et sous-domaines.
Je viens de remarquer qu’il y avait une petite particularité avec le nouveau Firefox 3.
Ce certificat est auto-signé.
Ok, on accède à votre site en https. Mais si le cryptage garantit la confidencialité (échange de mot de passe, etc), il ne garantit pas à vos visiteurs que votre site soit correct, sans virus, sans attaque, etc… Ni même que c’est bien votre site ! En effet, n’importe qui peut se créer un certificat auto-signé au nom d’un site connu (www.bill.com par exemple) et se faire passer pour vous.
Si vous aviez acheté en payant bien cher un certificat chez une autorité reconnue, comme Verisign, la situation serait différente ! Verisign garantirait que c’est bien vous qui avez demandé la création de ce certificat. Ce n’est pas le cas ici (bien trop cher Verisign) et personne de connu et de sérieux n’affirme haut et fort que vous êtes digne de confiance…
Et bien, ça, Firefox 3 le signale ! Il donne un message d’erreur indiquant que le certificat est auto-signé et considéré comme non sûr :
Il est heureusement possible de continuer, en forçant Firefox 3 à considérer votre site personnel comme fiable et à accepter le certificat
Mais il y a une autre possibilité : ne pas utiliser un certificat auto-signé, mais le faire générer par une autorité de certification “reconnue” …
Laissons donc tomber Verisign & co, bien trop cher pour un particulier ou un petit site… et tournons nous vers CAcert
CAcert, si elle n’est pas encore vraiment une autorité reconnue, est déjà plus appréciée que votre propre signature personnelle totalement inconnue de vos visiteurs
De plus, et c’est ce qui m’importe présentement : CAcert est une structure communautaire qui fourni des certificats gratuitement !
Générer un certificat signé par CAcert, valable pour plusieurs domaines et sous-domaines sur une seule adresse IP sera l’objet de mon prochain billet ![]()
juin 17th, 2008 at 3:23
[...] Un peu de tout Un blog utilisant WordPress « Sécurisation SSL : Certificat auto-signé multi-sites [...]