ARTICLES
Monter sa propre CA
C’est quoi une CA ?
La CA, pour Certificate Authority, est une institution (en général une entreprise, vous allez voir pourquoi) qui va fournir un certificat qu’on appelle raçine (root) et qui va pouvoir signer d’autres certificats. Ces certificats vont être utilisés dans le cadre d’échanges cryptographiques. Par exemple pour aller sur toto.com en HTTPS, vous allez recevoir le certificat de Toto qui sera signé par la CA “Bob”. Comme vous faites confiance à la CA “Bob”, vous allez considérer que le certificat de toto.com est valide et vous allez pouvoir chiffrer vos échanges avec toto.com en toute confiance.
La confiance
Oui, les CA sont avant tout une histoire de confiance. Vous accordez votre confiance dans une CA, ce qui signifie que si vous recevez un certificat qui a été signé par une CA dans laquelle vous avez confiance, vous allez considérer qu’il est valide.
En pratique, les gens ont plus tendance à faire confiance en une entreprise pour laquelle ils ont payé un service et avec laquelle ils ont donc un contrat et un cadre légal que pour une bande de potes qui ont monté une association entre eux et qui fournissent le même service que la dite entreprise. D’où le fait que la très grande majorité des CA sont des entreprises.
La thune
Il ne faut pas se mentir, le business des CA est extrêmement rentable : à partir d’un certifiat raçine (qui est totalement gratuit à générer), vous pouvez signer un nombre infini de certificats clients. Le plus dur étant de faire connaître votre certificat raçine afin que le plus de monde le considère comme de confiance (en pratique, quand votre certificat est considéré comme étant de confiance dans Chrome, Firefox, Windows et MacOS, vous êtes plutôt bien).
Les CA vendent donc leurs certificat (en réalité, ils vous vendent la signature de votre certificat par leur certificat raçine) à des tarifs assez élevés (étant donné que techniquement parlant, générer et signer des certificats est totalement gratuit et ne prend que quelques secondes) ; tarifs qui varient entre 50 € / an et plus de 1000 € / an selon le type de certificat et les assurances que vous prenez avec (vous pouvez prendre des assurances avec votre certificat qui vont vous indemniser si vous vous le faites voler - c’est aussi pour ça que c’est payant).
Depuis 2016, une nouvelle CA a fait son apparition : Let’s Encrypt. Cette CA a deux avantages majeurs : les certificats qu’elle délivre sont gratuits et vous pouvez générer des certificats totalement automatiquement et en quelques secondes (là où les CA classiques vont devoir vérifier manuellement chaque demande de signature de certificat, ce qui peut prendre plusieurs jours). C’est une organisation financée principalement par des sponsors, qui sont des grandes entreprises, comme Mozilla, Cisco, OVH, Facebook… Malgré tous les avantages de cette CA, vous n’avez que des certificats “classiques”, c’est à dire pas d’assurances, pas de multi-domaine et uniquement des certificats Web.
Pourquoi je vais m’emmerder à m’en faire une maison ?
Pour trois raisons principales :
- c’est totalement gratuit
- vous devenez indépendant et autonome
- c’est très simple (quand on connaît les lignes de commandes…)
C’est parti
On va générer plusieurs choses :
- une clé + certificat raçine (qu’on appellera root CA)
- une clé + certificat intermédiaire
- une clé + certificat client
Le certificat intermédiaire va nous permettre de gagner en sécurité : on signe le certificat intermédiaire avec le root CA puis on met le root CA dans un coffre-fort inaccessible depuis Internet. Si on se fait un jour voler la clé de notre certificat intermédiaire, on a juste à récupérer notre root CA, révoquer le certificat intermédiaire et en générer un nouveau, puis remettre la root CA dans notre coffre-fort. Si on se fait voler le root CA, on ne peut rien faire, mis à part prévenir tout le monde que notre root CA est compromis (ce qui est extrêmement compliqué, bien plus que générer une révocation et la propager).
À noter également que dans ce cas, ça sera le certificat intermédiaire qui va signer tous les certificats clients.
Bien évidemment, vous aurez besoin d’openssl, mais à priori vous l’avez déjà dans votre distribution.
Détails techniques : on va utiliser ici des clés ECDSA avec la courbe P-384 et du SHA256. Pourquoi ? Parce que c’est mieux que du RSA / SHA1 et que c’est supporté quasiment partout. Vous pouvez tout à fait utiliser autre chose, mais il y a des chances que tout ne soit pas compatible du coup. On va également chiffrer nos clés privées avec de l’AES 256.
Vous aurez besoin des fichiers de configuration d’OpenSSL :
Générer la root CA
On commence par préparer tout le bazar
1$ mkdir CA/{root,intermediate}/{certs,crl,newcerts,private}
2$ mkdir intermediate/csr
3$ touch {root,intermediate}/index.txt
4$ echo 1000 > {root,intermediate}/serial
5$ echo 1000 > intermediate/crlnumber
6$ chmod 0700 root/private intermediate/private
7$ mv openssl-root.cnf CA/root/
8$ mv openssl-intermediate.cnf CA/intermediate/Générer une clé ECDSA avec la courbe P-384
1$ cd root
2$ openssl ecparam -name secp384r1 -genkey -noout -out private/ca.key.pem
3$ openssl ec -in private/ca.key.pem -out private/ca.key.pem -aes256
4$ chmod 0400 private/ca.key.pemGénérer le certificat (auto-signé) pour 20 ans
1$ openssl req -config openssl-root.cnf -key private/ca.key.pem -new -x509 -days 7300 -extensions v3_ca -sha256 -out certs/ca.cert.pem
2Country Name (2 letter code) [AU]:FR
3State or Province Name (full name) [Some-State]: France
4Locality Name (eg, city) []:Paris
5Organization Name (eg, company) [Internet Widgits Pty Ltd]: Chez Moi
6Organizational Unit Name (eg, section) []: Chez Moi root CA
7Common Name (e.g. server FQDN or YOUR name) []: Chez Moi
8Email Address []:Générer la clé et le certificat intermédiaire
Générer une clé ECDSA avec la courbe P-384
1$ cd ../intermediate
2$ openssl ecparam -name secp384r1 -genkey -noout -out private/intermediate.key.pem
3$ openssl ec -in private/intermediate.key.pem -out private/intermediate.key.enc.pem -aes256
4$ chmod 0400 private/intermediate.key.pemGénérer la demande de certificat
1$ openssl req -config openssl-intermediate.cnf -new -sha256 -key private/intermediate.key.pem -out csr/intermediate.csr.pem
2Country Name (2 letter code) [AU]:FR
3State or Province Name (full name) [Some-State]: France
4Locality Name (eg, city) []: Paris
5Organization Name (eg, company) [Internet Widgits Pty Ltd]: Chez Moi
6Organizational Unit Name (eg, section) []: Chez Moi intermediate CA 1
7Common Name (e.g. server FQDN or YOUR name) []: chezmoi.fr
8Email Address []:Attention : le common name doit être différent de celui de la CA.
Signer le certificat intermédiaire
1$ cd ../root
2$ openssl ca -config openssl-root.cnf -extensions v3_intermediate_ca -days 3650 -notext -md sha256 -in ../intermediate/csr/intermediate.csr.pem -out ../intermediate/certs/intermediate.cert.pemLe certificat intermédiaire est maintenant signé. On peut vérifier avec :
1$ cd ../intermediate
2$ openssl x509 -noout -text -in certs/intermediate.cert.pemet :
1$ openssl verify -CAfile ../root/certs/ca.cert.pem certs/intermediate.cert.pemGénérer des clés client
Générer la clé ECDSA avec la courbe P-384
On génère une clé non chiffrée (si on veut la chiffrer, voir “openssl ec” des commandes ci-dessus) :
1$ mkdir clients
2$ cd clients
3$ mkdir app.akaoj.fr
4$ cd app.akaoj.fr
5$ openssl ecparam -name secp384r1 -genkey -noout -out app.chezmoi.fr.key.pemOn génère la demande de certif
1$ cd ../../intermediate
2$ openssl req -config openssl-intermediate.cnf -key ../clients/app.chezmoi.fr/app.chezmoi.fr.key.pem -new -sha256 -out ../clients/app.chezmoi.fr/app.chezmoi.fr.csr.pemRentrer les infos (surtout l’Organization Name - Chez Moi - et le Common Name - app.chezmoi.fr).
Signer le certificat client
1$ openssl ca -config openssl-intermediate.cnf -extensions server_cert -days 3650 -notext -md sha256 -in ../clients/app.chezmoi.fr/app.chezmoi.fr.csr.pem -out ../clients/app.chezmoi.fr/app.chezmoi.fr.cert.pemNB : selon le type de certificat à signer, mettre la bonne extension. server_cert concerne les certificats serveur (pour HTTPS par exemple) et user_cert les certificats clients (pour le Wifi ou les interfaces Web par exemple).
Voilà !
Vous voilà avec votre propre CA et vos certificats signés. Il vous reste encore à propager votre certificat raçine (le fichier CA/root/certs/ca.cert.pem) sur toutes les machines qui doivent faire confiance à votre CA (et aussi de stocker votre root CA dans un lieu très sûr - vous n’en aurez presque jamais l’utilité) afin que tous les certificats signés par votre intermediate soient automatiquement trustés.