Certificat SSL/TLS auto signé avec sa propre autorité de certification
Aujourd'hui, un petit tutoriel sur la génération de certificats SSL/TLS auto signé avec openssl. Il en existe déjà des dizaines sur le web. Celui-ci n'apporte pas grand chose de nouveau, si ce n'est me permettre de garder la procédure sous le coude (qui a dit égoïste ?).
SSL/TLS Quèsaco ?
Pour rappel, SSL (Secure Socket Layer) et son remplaçant TLS (Transport Layer Security) sont des protocoles permettant de chiffrer (personne ne peut lire les échanges client/serveur) et d'authentifier (on est sûr de parler à la bonne personne) une connexion réseau. C'est le mécanisme qui est mis en oeuvre lorsqu'on accède à un site via https:// (entre autres).
Le modèle SSL/TLS repose sur une chaîne de confiance. C'est à dire que chacun des maillons va signer le suivant (jusqu'au final). Donc, si on est sûr du maillon initial (racine), on peut vérifier la chaîne de bout en bout. C'est la faiblesse théorique du protocole : celui qui a la clé privée du certificat racine (l'autorité de certification ou Certificate Authority (CA) en anglais) peut faire ce qu'il veut, comme générer une chaîne complète. Les certificats racines de confiance (partie publique uniquement) étant enregistrés dans un répertoire du navigateur (Firefox, Chrome...) lors de l'installation et mis à jour régulièrement (certains sont même révoqués avant leur date d'expiration).
Cela paraît un peu flou ? Exemple simple, mais néanmoins courant : votre entreprise construit son propre certificat racine et l'enregistre dans votre navigateur (ceci est tout à fait légal), elle pourra générer à la volée un certificat pour *.google.com et ainsi pouvoir lire tous vos mails de mail.google.com (gmail) sans que le navigateur ne détecte d'erreurs !
Certificat auto-signé, pourquoi ?
Le marché du certificat est très juteux. Pour assurer votre sécurité, les autorités de certification vendent chaque certificat plusieurs centaines d'euros par an (une dizaine pour un particulier). Pourtant, le travail de certification est relativement simple. Il existe cependant des autorités gratuites telles que CACert, mais, très peu d'entres elles voient leurs certificats racines intégrés aux navigateurs.
Jadis, j'utilisais un certificat OVH (signé par Symantec Corporation), puis un certificat Gandi (COMODO CA Ltd), mais, au delà de l'aspect pécunier, j'ai décidé de vouloir maîtriser ma chaîne de bout en bout car, quitte à ne pas être reconnu par les navigateurs, autant que je puisse vérifier que je ne suis pas espionné.
Générer un certificat, la pratique
La première chose à faire est de générer la clé privée et le certificat racine de notre autorité de certification (CA). Pour cela, je choisis de générer un certificat d'une validité de 10 ans avec une taille de clé 4096 bits. La clé privée (protégée par un mot de passe) sera contenue dans soutade-ca.key, et le certificat racine (partie publique) dans soutade-ca.crt
openssl req -new -x509 -extensions v3_ca -keyout soutade_ca.key -out soutade_ca.crt -days 3650 -newkey rsa:4096
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:France
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Soutade CA
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Maintenant que nous avons notre autorité, nous allons passer au certificat final (on pourrait en avoir des intermédiaires) pour tout soutade.fr. Il faut répéter la procédure à partir de cette étape lors du renouvellement annuel.
Il faut commencer par créer une clé privée (2048 bits dans cet exemple) :
openssl genrsa -out soutade.fr.key 2048
La requête de signature (sans mot de passe)
openssl req -key soutade.fr.key -new -out soutade.fr.csr
Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:France
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Soutade
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:*.soutade.fr
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Enfin, le certificat final (signé par notre autorité) et valide 1 an (maximum recommandé)
openssl x509 -req -days 365 -in soutade.fr.csr -CA soutade_ca.crt -CAkey soutade_ca.key -out soutade.fr.cert -CAcreateserial -CAserial soutade_ca.srl
Accessoirement, on peut supprimer les requêtes de signature
rm -f *.csr
L'option -CAcreateserial va créer le fichier soutade_ca.srl. C'est important pour ne pas regénérer un certificat avec le même numéro de série.
IMPORTANT : Maintenant, il faut stocker la clé privée de l'autorité racine dans un lieu SÛR. Je conseille de faire un GPG du tar.gz et de le copier sur plusieurs supports !
Configuration pour nginx
La première étape est d'installer les certificats sur le système (exemple sur Debian)
sudo cp soutade.fr.key soutade.fr.cert /etc/ssl/
Deuxième étape, configurer nginx. Dans /etc/nginx/sites-available/default
listen 80 default; ## listen for ipv4
listen 443 ssl; ## listen for ipv4
server_name soutade.fr *.soutade.fr;
ssl_certificate /etc/ssl/soutade.fr.cert;
ssl_certificate_key /etc/ssl/soutade.fr.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1.2;
ssl_ciphers HIGH;
ssl_prefer_server_ciphers on;
On pourra noter que je n'active que TLSv1.2 avec les algorithmes de chiffrement les plus hauts et en préférant ceux du serveur. À la vue des dernières découvertes autour de SSL/TLS, les experts en sécurité conseillent fortement de désactiver les versions (obsolètes) de SSL (v3) et TLS (v1), quitte à ne pas supporter les vieux navigateurs (TLSv1.2 est quand même sorti en 2008).
Installation dans Firefox
Pour ce faire, il faut copier soutade-ca.crt en soutade-ca.pem, puis (dans Firefox) : Édition-> Préférences -> Avancé -> Afficher les certificats -> Importer...
Conclusion
Maintenant nos connexions sont protégées des vils pirates ? Pas forcément ! Comme dans l'exemple, il y a toujours la possibilité de générer à la volée un certificat à partir d'une autorité de certification que l'on maîtrise. Le seul moyen pour ne pas se faire avoir est de vérifier l'empreinte du certificat quand nous nous connectons, mais en général, l'autorité de certification ne mentionnera pas "Soutade CA" comme émetteur (plus facile à contrôler).