Ah, enfin. Ça y est, hourra, depuis le temps que l’on attendait cela, c’est enfin possible : il est enfin possible avec Apache et OpenSSL d’héberger sur un même serveur plusieurs sites sécurisés avec chacun son certificat propre.
J’héberge sur mon serveur plusieurs sites. Deux en particulier ont besoin d’être sécurisés, non pas pour garantir qu’il s’agit de moi (je ne suis pas une banque, personne n’essaiera jamais de se faire passer pour moi), mais parce que ce qui y est écrit est personnel et que je suis un grand parano qui ne veux pas laisser d’accès à des personnes que je ne connais pas.
Comme je veux cependant garantir l’accès de mes sites au plus grand nombre, je cherche à éviter les affichages d’erreurs moches et incompréhensibles des problèmes de sécurité, qui deviennent particulièrement pénibles avec Firefox 3.5. Du coup, deux choses à faire :
- acheter des vrais certificats, du moins ne pas utiliser des certificats auto-signés. C’est tout à fait contre ma pratique et mes habitudes en informatique, mais il faut se rendre à l’évidence : tous les navigateurs font croire que l’on tombe chez des pirates quand le certificat est auto-signé. C’est très triste d’en arriver là. Néanmoins, ayant trouvé des certificats à pas cher, je me fournis maintenant chez RapidSSL pour des certificats que ne m’ont causé aucun problème.
- pouvoir séparer les noms de domaine sur mon serveur web.
Le deuxième point paraît simple. Il s’agit pourtant d’une grande impossibilité du chiffrement SSL tel qu’il été conçu à l’origine : le chiffrement est effectué sur l’adresse dès l’envoi de la requête par le navigateur, et le déchiffrement n’a lieu sur le serveur qu’après sélection du certificat pour déchiffrer… La sélection du certificat ne peut donc pas dépendre de l’adresse demandée.
Sous Ubuntu, une solution existait jusqu’à maintenant. Utiliser GnuTLS, qui comme son nom l’indique permet l’utilisation du protocole TLS, dernière évolution de SSL. Pourquoi ? Parce qu’avec TLS, il est possible de balancer en clair l’adresse grâce à l’extension appelée SNI. Problème de GnuTLS, c’est un peu instable et il arrive notamment en cas de requêtes multiples de se voir servi par un mauvais certificat : on retombe sur les messages d’erreur, encore plus dérangeant parce qu’incompréhensibles vu que ça fonctionnait une seconde avant…
Apache, le logiciel serveur, supportait le TLS, mais pas le SNI avec OpenSSL. C’était un bug connu, qui a été réparé début août, mais pour Ubuntu Karmic uniquement. Cette version est installée depuis quelques jours (tout juste avant sa sortie finale, soyons fous…) sur mon serveur, et cela marche comme un charme. Il suffit de mettre dans la configuration générale, par exemple /etc/apache2/ports.conf :
Listen 443 NameVirtualHost *:443
puis dans la configuration de chaque site :
<VirtualHost _default_:443> ServerName votredomaine.fr SSLEngine on SSLCertificateFile /etc/apache2/ssl/votrecertificat.crt SSLCertificateKeyFile /etc/apache2/ssl/laclécorrespondante.key ... </VirtualHost>
À noter aussi l’existence d’un autre logiciel serveur, Lighttpd. Il a notamment l’avantage d’être plus léger qu’Apache. Je ne l’utilise pas sur mon serveur plus par inertie, parce qu’Apache est parfaitement configuré, mais je l’utilise sur mon portable pour avoir un serveur web de test avec moi, et je le trouve très bien et très réactif. Je pensais qu’il supportait SNI depuis quelques temps, mais visiblement ce n’est le cas que depuis 5 jours. Bref, le choix est ouvert, comme toujours dans le monde libre.