Table des matières
Certificat SSL auto-signé
source:
https://www.digicert.com/kb/ssl-support/openssl-quick-reference-guide.htm
https://adfinis.com/fr/blog/creer-des-certificats-openssl-x509/
https://www.linuxtricks.fr/wiki/openssl-creation-de-certificats-et-ca-autosignes
Lorsqu'on utilise un service sécurisé on a besoin d'un certificat SSL notamment pour des sites sur HTTPS. Deux solutions sont possibles: soit acquérir un certificat par une autorité officielle et donc payant soit en générer un soi-moime en auto-signé. C'est cette dernier solution qu'on va voir ici. Mais d'abord on verifie la version d'openssl de notre machine.
openssl version -a
example de résultat
OpenSSL 1.1.1n 15 Mar 2022 built on: Sun Feb 5 21:23:17 2023 UTC platform: debian-amd64 options: bn(64,64) rc4(16x,int) des(int) blowfish(ptr) compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -Wa,--noexecstack -g -O2 -ffile-prefix-map=/build/openssl-8bYUb4/openssl-1.1.1n=. -fstack-protector-strong -Wformat -Werror=format-security -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DRC4_ASM -DMD5_ASM -DAESNI_ASM -DVPAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DX25519_ASM -DPOLY1305_ASM -DNDEBUG -Wdate-time -D_FORTIFY_SOURCE=2 OPENSSLDIR: "/usr/lib/ssl" ENGINESDIR: "/usr/lib/x86_64-linux-gnu/engines-1.1" Seeding source: os-specific
Pour générer une clé on dispose de plusieurs options: l'algorithme de chiffrement, la taille de la clé et la passphrase qui la sécurise.
Le standard pour l'algorithme est le RSA pour des raisons de compatibilité… mais la mode coté sécu est le ed25519
Pour la taille c'est le 2048 le standard de nos jours, mais on trouve de plus en plus la recommandation en 4096.
La passphrase n'est pas obligatoire mais fortement conseillée. Si elle est utilisé vous devez la connaitre pour déchiffrer les clés.
Les certificats sont basés sur les clés SSL privées et publiques. Il est donc nécessaire de générer ces clés. Comme la clé privée est la base du processus de certification il faut la générer en premier lieu! Meme si en général l'extension est .KEY, le format par défaut est le PEM (il en existe d'autre: DER, PKCS)
https://www.openssl.org/docs/man1.0.2/man1/genrsa.html
https://www.openssl.org/docs/man3.3/man1/openssl-genpkey.html
Générer les clés privée et publique
La clé privée contient la clé publique associée. Cette clé publique est celle qu'on fournit à des tiers si besoin. Les clés sont au format PEM par défaut, l'extension n'a pas d'importance. Pour facilité l'usage on utilise .KEY pour la clé privé et .PEM pour la clé publique. Les extensions n'indiquent pas forcément le type de fichier. C'est le format d'encodage qui est important (binaire ou ASCII base64).
https://www.ssldragon.com/fr/blog/difference-fichiers-cer-et-crt/
Clé privée
Générer la clé privé (avec cryptage DES3, il faudra fournir une passphrase)
openssl genrsa -des3 -out maClePrivee.key 4096
déconseillé: Si vous ne voulez pas de passphrase enlevez l'option -des3
Pour retirer le mot de passe d'une clé
openssl rsa -in maCleAvecMdp.key.protected -out maCleSansMdp.key
remarque: par défaut sur Debian une clé existe déja et se nomme “/etc/ssl/private/ssl-cert-snakeoil.pem”
Clé publique
Pour extraire la clé publique de la clé privée:
openssl rsa -in maClePrivee.key -pubout -out maClePublique.pem
Le serveur Certificat Authority (CA)
Un CA une entité officielle autorisée et reconnue pour signer les demandes de certificat. Les certificats des CA officiels sont par défaut présent sur toutes les machines nécessitant des certificats de sécurité. Les certificats signés par ces entités sont payants ! On va créer notre propre CA qui n'est pas sur les machines (hotes) du monde entier, il faudra donc le mettre sur nos hotes pour que nos certificats qu'on va signé soit reconnu.
On génère le certificat racine de notre propre serveur CA.
openssl req -x509 -new -nodes -key maClePriveeCA.key -sha256 -days 10000 -out monCertificatCA.pem
ici mon certificat racine est valable 10000 jour. Les informations demandées concernent le serveur CA qui signera les demande de certicifat.
Si besoin d'un format CERT
openssl x509 -in monCertificatCA.pem -inform PEM -out monCertificatCA.crt
Le Certificat X.509
Le CA X.509 est le certificat à utiliser pour avoir le HTTPS. Il est signé par notre serveur CA. Pour l'obtenir on doit fournir un fichier CSR. C'est ce fichier CSR qui sera signé avec notre certificat CA créé plus haut. Il faut donc généré un CSR !
Créer une fichier CSR
Le fichier request (req) CSR pour un hébergement web SSL est dans la norme X509 et au format PEM par défaut. On peut soit renseigner le contenue en répondant aux questions soit en fournissant un fichier texte en ajoutant le paramètre “-config maRequete.conf”
https://www.openssl.org/docs/man1.0.2/man5/x509v3_config.html
example de maRequete.conf (pour mon serveur web) SANS sous domain
[req] distinguished_name = req_distinguished_name req_extensions = v3_req prompt = no [req_distinguished_name] C = US ST = VA L = SomeCity O = MyCompany OU = MyDivision CN = www.company.com [v3_req] keyUsage = keyEncipherment, dataEncipherment extendedKeyUsage = serverAuth
Commande:
openssl req -new -key maClePrivee2.key -out maRequete.csr -config maReqete.conf
maClePrivee2.key est la clé privée de mon serveur web qui demande un certificat (peut etre différent du serveur CA)
Pour vérifier le contenu CSR qui sera soumis à certification
openssl req -text -in maRequete.csr -noout -verify
note: tout en ligne de commande
https://net-security.fr/securite/openssl-csr-san-en-cli/
Maintenant que j'ai mon CSR je vais le faire signer par mon CA afin d'obtenir mon certiifcat que je placerai dans mon serveur web Apache afin d'avoir un site en HTTPS.
Dans le cas de sous domaine (virtualhost) le CSR génère un certificat sans sous domaine. Meme si le CSR contient les informations nécéssaires ils ne sont pas pris en compte! Il faut créer un autre fichier de configuration avec ces informations:
requestSousDomaine.conf
authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, keyEncipherment subjectAltName = @alt_names [alt_names] DNS.1 = www.company.com DNS.2 = company.com DNS.3 = www.company.net DNS.4 = company.net*
Si vous n'avez pas de sous domaine, ne pas ajouter en fin de commande “-extfile requestSousDomaine.conf”
Vous n'avez pas de serveur CA
Vous aurez une alerte en consultant la page mais votre site sera en HTTPS:
openssl x509 -req -days 10000 -in maRequete.csr -signkey maClePrivee.key -out monCertificatHTTPS.crt -extfile requestSousDomaine.conf
Vous avez votre propre serveur CA
Pour ne pas avoir d'alerte le certificat racine de notre CA doit être présent sur les hotes qui consulteront notre site HTTPS.
openssl x509 -req -days 10000 -in maRequete.csr -CA monCertificatCA.pem -CAkey maClePriveeCA.key -CAcreateserial -out monCertificatHTTPS.crt -sha256 -extfile requestSousDomaine.conf
note : Un fichier *.srl va etre créé, c'est l'ID du certificat. (???)
Pour controler le contenu du certificat crt obtenu:
openssl x509 -inform pem -noout -text -in monCertificatHTTPS.crt