Skip to content

SSL / TLS

Le protocole SSL / TLS est devenu la base de la sécurité sur internet et sa gestion peut vite devenir un casse-tête. Il existe pourtant des outils puissants comme OpenSSL pour gérer tous ces certificats. Voici quelques-unes des commandes les plus utiles.

[NOTE]
OpenSSL est disponible pour toutes les distributions Linux, soit pré-intégré, soit via les gestionnaires de paquets habituels.
Des versions précompilées pour Windows existent (https://wiki.openssl.org/index.php/Binaries) mais il est aussi possible d'utiliser OpenSSL via Cygwin ou WSL.
Il est de toute façon toujours possible de compibler OpenSSL à partir des sources.

Génération des certificats SSL

Générer un certificat auto-signé

openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout privateKey.key -out certificate.crt -subj "/C=FR/ST=Ile-De-France/L=Paris/O=Mon organisation/CN=www.mon-site.fr"

Générer une Certificate Signing Request (CSR) et sa clé privée

openssl req -out CSR.csr -new -newkey rsa:2048 -nodes -keyout privateKey.key

Générer une Certificate Signing Request (CSR) en utilisant une clé privée existante

openssl req -out CSR.csr -key privateKey.key -new

Générer une Certificate Signing Request (CSR) pour un certificat avec plusieurs Subject Alternative Names (SAN)

Tout d'abord, il faut créer un fichier (que j'appelle ici san.cnf) contenant la configuration de la CSR :

[req] default_bits = 2048
distinguished_name = req_distinguished_name
req_extensions = req_ext
[req_distinguished_name]
countryName = FR
stateOrProvinceName = Ile-De-France
localityName = Paris
organizationName = Mon organisation
commonName = www.mon-site.fr
[req_ext]
subjectAltName = @alt_names
[alt_names]
DNS.1   = www.mon-site.fr
DNS.2   = www.mon-site.com
DNS.3   = blog.mon-site.com
Ensuite, lancer la commande OpenSSL suivante utilisant notre fichier de configuration san.cnf pour créer la CSR et la clé privée :
openssl req -out CSR.csr -newkey rsa: 2048 -nodes -keyout privateKey.key -config san.cnf

Générer une Certificate Signing Request (CSR) basée sur un certificat existant

openssl x509 -x509toreq -in certificate.crt -out CSR.csr -signkey privateKey.key

Générer un certificat auto-signé et son export en .pfx en powershell

# Génère le certificat auto-signé dans le magasin de certificats de l'utilisateur
$cert = New-SelfSignedCertificate -Subject "C=FR,ST=Ile-De-France,L=Paris,O=Mon organisation,CN=www.mon-site.fr"  -CertStoreLocation "Cert:\CurrentUser\My" -KeyExportPolicy Exportable -KeySpec Signature -KeyLength 2048 -KeyAlgorithm RSA -HashAlgorithm SHA256

# Export du certificat
Export-Certificate -Cert $cert -FilePath ".\certificate.cer"

# Création du password
$mypwd = ConvertTo-SecureString -String "1234" -Force -AsPlainText

# Export du .pfx
Export-PfxCertificate -Cert $cert -FilePath ".\certificate.pfx" -Password $mypwd
Souce : https://learn.microsoft.com/en-us/azure/active-directory/develop/howto-create-self-signed-certificate

Checks des fichiers générés

Vérifier une Certificate Signing Request (CSR)

openssl req -text -verify -in CSR.csr

Vérifier une clé privée

openssl rsa -in privateKey.key -check

Vérifier un certificat

openssl x509 -in certificate.crt -text

Vérifier un keystore PKCS#12 (.pfx ou .p12)

openssl pkcs12 -info -in keyStore.p12

Vérifier que le hash MD5 correspond entre le certificat, la clé privée et la CSR

openssl x509 -noout -modulus -in certificate.crt | openssl md5
openssl rsa -noout -modulus -in privateKey.key | openssl md5
openssl req -noout -modulus -in CSR.csr | openssl md5

Conversions

[Conventions de nommage]
Voici les extensions communes des certificats au format X.509 :

  • .pem : certificat DER encodé en Base64, encadré par les mentions "-----BEGIN CERTIFICATE-----" et "-----END CERTIFICATE-----"
  • .cer, .crt, .der : certificat DER au format binaire
  • .p7b, .p7c : PKCS#7, contient plusieurs certificats ou CRL(s)
  • .p12 : PKCS#12, keystore contenant un bloc clé privée et un bloc certificat
  • .pfx : PFX, prédécesseur de PKCS#12

Plus d'infos : https://serverfault.com/a/9717

Retirer la passphrase d'une clé privée

openssl rsa -in privateKey.pem -out newPrivateKey.pem

Convertir un certificat DER au format PEM

openssl x509 -inform der -in certificate.cer -out certificate.pem

Convertir un certificat PEM au format DER

openssl x509 -outform der -in certificate.pem -out certificate.der

Convertir un certificat PKCS#12 (.p12, .pfx) contenant une clé privée au format PEM

openssl pkcs12 -in keyStore.pfx -out keyStore.pem -nodes
!!!! Vous pouvez utiliser l'option -nocerts pour ne générer que la clé privée ou l'option -nokeys pour ne générer que le certificat.

Convertir un certificat PEM et sa clé privée au format PKCS#12 (.p12 ou .pfx)

openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt

Débug d'une connexion SSL/TLS

openssl s_client -connect www.mon-site.fr:443

Last update: September 26, 2023
Created: September 26, 2023