NGinx : HTTPS en toute simplicité avec un certificat CAcert.org

Désirant  quelques certificats dont je disposerais par ci par là sur mes sphères — qui je le rappelle tournent dorénavant sous NGinx —, j'ai été confronté à un choix plus ou moins éthique : serai-je ma propre autorité de certification ou puis-je faire confiance à un tiers pour cela ? De façon égoïste, cela ne me gène nullement mais le visiteur, lui, me fera-t-il confiance si d'aventure son navigateur lui envoie des signaux d'alerte ?

Cruel dilemme : par principe, je n'ai que moyennement confiance en une autorité qui avaliserait tout et n'importe quoi pour peu que l'on "allonge la thune", je cherchais donc une structure participative de validation.

Compromis entre autorité et partenariat : CAcert.org

Me renseignant sur les différentes autorités existantes proposant des certificats gratuits (c'est la crise ma bonne dame), je suis tombé bienheureusement sur CAcert, une association sans but lucratif australienne qui de loin déjà ressemblait à ce que je recherchais.

Ainsi qu'expliqué dans la page d'à propos, corrigez-moi si je me trompe, CAcert.org est avant tout une communauté, puisque l'on parle d'autorité de certification dirigée par sa communauté. Comment ?

CAcert a été conçue par la communauté pour la communauté, et plutôt que de faire peser tout le poids sur une autorité centrale et ainsi augmenter le prix des certificats, l'idée était de faire travailler la communauté de concert avec ce site pour que la confiance soit maintenue de manière distribuée et automatisée ! (source)

Web of Trust et points d'assurance

Afin de créer des certificats, vous devez prouver votre identité (mail, nom de domaine, ...) ou mieux encore, rencontrer des notaires afin d'obtenir des points de confiance. L'obtention de points de confiance est sinon importante, au moins rudement pratique : cela vous permet de générer des certificats valides non pas 6 mais 24 mois, par exemple.

Création d'un certificat

La manière la plus simple de procéder est, à mon avis, de suivre les solutions que proposent CAcert, en l’occurrence, j'utiliserai un script trouvé sur leur serveur afin de créer une demande de certificat : CSRGenerator.

Pour l'utiliser, rien de bien sorcier : enregistrez un fichier texte avec le contenu de la page liée, que ça soit sur votre ordinateur personnel ou votre serveur. Pour ma part, ce sera sur le serveur, par SSH :

wget http://svn.cacert.org/CAcert/Software/CSRGenerator/csr -O CSRGenerator

Il ne me reste alors plus qu'à le rendre exécutable au moyen d'un :

chmod +x CSRGenerator

L'exécution en soi ne devrait pas poser le moindre problème, les champs étant d'une simplicité et d'une clarté confondantes :

  • un nom générique donné au certificat, au choix ;
  • le FQDN / CommonName pour le certificat (votre nom de domaine, sans www ni http://, par exemple) ;
  • des noms alternatifs ou aliases au nom de domaine, comme par exemple des sous-domaines ;
  • laisser le dernier sous-domaine vide pour lancer la génération des fichiers.

N.B. : Cyril propose de générer le CSR en se passant de script, soit comme ceci (je cite) :

openssl genrsa [longueur de la clé] > [emplacement de la clé privée]
openssl req -new -key [ta clé] > [ta demande de certificat]

Suite à quoi, rendez-vous sur le site de CAcert et, dans votre interface d'administration, collez votre demande de signature de certificat (CSR) dans le champs d'envoi - vraiment rien de sorcier. Après votre envoi, votre certificat serveur devrait vos être livré, copiez-le dans un fichier (pour la démonstration, j'utiliserai example_server.pem) auprès des autres fichiers générés par le script. Ainsi j'obtiens :

  • example_server.pem délivré par CAcert ;
  • example_csr.pem, la demande de certificat générée par CSRGenerator ;
  • example_privatekey.pem.

Configuration de NGinx

Histoire de bien commencer, il suffit de créer un dossier où seront stocké les certificats. Quoi de plus simple que quelque part dans le dossier de NGinx ? Pour ce faire, la création d'un dossier spécifique à CAcert suffit, à vous de choisir où vous les mettrez de préférence. Pour ma part, ce sera :

mkdir -p /etc/nginx/ssl/cacert/

NGinx et le CRT racine

Manquement des versions actuelles de NGinx, celui-ci ne semble pas gérer les certificats racine (comme celui de CAcert par exemple). Qu'à cela ne tienne, une simple manipulation suffit à faire fi du problème : fusionner le certificat racine et le certificat serveur. Pour ce faire, une simple commande et le tour est joué.

cat /etc/ssl/certs/cacert.org.pem example_server.pem >> example_crt.pem

Vous pouvez dès lors copier example_crt.pem et example_privatekey.pem dans /etc/nginx/ssl/cacert/, c'est là qu'ils vous seront les plus utiles.

Configuration du VHOST

Je prends pour acquis que vous sachiez configurer un vhost sous NGinx. Pour l'heure, j'utilise un simple serveur HTTP/HTTPS, rassemblant les directives pour les ports 80 et 443 ainsi qu'expliqué dans la documentation. Certes ce n'est pas le meilleur exemple à suivre, mais il a le mérite d'être simple et intuitif.

server {
    listen               80;
    listen               443  ssl;
    server_name          www.example.domain;
    ssl_certificate      /etc/nginx/ssl/cacert/example_crt.pem;
    ssl_certificate_key  /etc/nginx/ssl/cacert/example_privatekey.pem;
[...]
}

Il ne vous reste plus qu'à redémarrer le processus après modification :

service nginx restart