Certificat SSL/TLS auto signé avec sa propre autorité de certification

Wednesday, 07 January 2015
|
Écrit par
Grégory Soutadé

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).

Chaine de confiance

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 !

Hiérarchie de certificats

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).

Nine nine nine nine. Are you sure that's random ? That's the problem with randomness : you can never be sure

Auteur :


e-mail* :


Le commentaire :




* Seulement pour être notifié d'une réponse à cet article
* Only for email notification