Certificat SSL auto-signé

source:

https://www.digitalocean.com/community/tutorials/how-to-create-a-self-signed-ssl-certificate-for-apache-in-ubuntu-20-04-fr

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/

https://www.digicert.com/kb/ssl-support/openssl-quick-reference-guide.htm#ConvertingCertificateFormats

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
La génération de ces paires de clés DOIVENT être faite sur chaque serveur.

Le serveur Certificat Authority (CA)

Si vous navez pas besoin de CA générez directement le certificat X.509

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
Ce certificat de notre propre serveur CA sera à mettre sur TOUS les hotes

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
Dernière modification : le 2024/06/11