Skip to content
Learni
Voir tous les tutoriels
Sécurité

Comment générer des certificats SSL avec OpenSSL en 2026

Read in English

Introduction

OpenSSL reste en 2026 l'outil de référence pour la cryptographie open-source, utilisé par 99% des serveurs web pour gérer les certificats SSL/TLS. Que vous configuriez un reverse proxy Nginx, un cluster Kubernetes ou une API Node.js, savoir générer des clés privées, des CSR (Certificate Signing Requests) et des certificats auto-signés est indispensable pour les environnements de dev, staging ou même prod isolés.

Ce tutoriel intermédiaire vous guide pas à pas : de la génération de clés RSA/ECC aux configurations personnalisées via openssl.cnf, en passant par les conversions de formats (PEM, PKCS12). Imaginez OpenSSL comme un atelier de forgeron crypto : vous forgez vos propres armes de sécurité. À la fin, vous saurez implémenter une PKI (Public Key Infrastructure) basique, valider des certificats et éviter les failles courantes comme les clés faibles ou les SAN manquants. Prêt à sécuriser vos déploiements ? (128 mots)

Prérequis

  • OpenSSL 3.0+ installé (Linux: sudo apt install openssl; macOS: brew install openssl; Windows: via Chocolatey ou WSL).
  • Terminal Unix-like (Bash/Zsh).
  • Connaissances de base en cryptographie : RSA vs ECC, PEM vs DER.
  • Espace de travail vide : mkdir openssl-tutorial && cd openssl-tutorial.

Vérifier l'installation d'OpenSSL

terminal
openssl version -a
openssl list -1 -cipher-algorithms | head -5
openssl rand -hex 32

Cette séquence vérifie la version (doit être 3.x pour les courbes ECC modernes), liste les algos disponibles et génère un hex aléatoire pour tester l'entropie. Évitez les versions <3.0 qui manquent de post-quantum readiness ; si erreur, réinstallez via gestionnaire de paquets.

Les bases : Clés et formats

Avant de plonger, comprenez les formats : PEM (texte base64, .pem/.key) pour la compatibilité universelle ; PKCS12 (binaire chiffré, .p12/.pfx) pour les stores Java/Tomcat. Une clé privée RSA 2048 bits est standard, mais passez à ECC P-384 pour la perf (comme NIST recommande en 2026). Chaque commande génère des fichiers autonomes, toujours protégés par passphrase initiale.

Générer une clé privée RSA 4096 bits

terminal
openssl genpkey -algorithm RSA -out private-rsa.key -aes256
openssl rsa -in private-rsa.key -out private-rsa-unencrypted.key -passin pass:SuperSecretPass2026

La première commande crée une clé chiffrée AES-256 (passphrase interactive ou via -passout). La seconde la dé-chiffre pour les serveurs (attention : plus vulnérable au vol). Utilisez 4096 bits min en 2026 ; piège : oubliez la passphrase ou utilisez DSA obsolète.

Générer un CSR avec Subject Alternative Names (SAN)

terminal
cat > san.cnf << EOF
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req

[req_distinguished_name]

[v3_req]
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1 = example.com
DNS.2 = www.example.com
IP.1 = 192.168.1.100
EOF

openssl req -new -key private-rsa-unencrypted.key -out example.csr -config san.cnf -subj "/C=FR/ST=Paris/L=Paris/O=Learni/OU=Dev/CN=example.com"

Ce script crée un san.cnf pour SAN (essentiel pour HTTPS multi-domaines), puis génère un CSR signé par la clé privée. Le -subj évite l'interactif ; vérifiez avec openssl req -text -noout -in example.csr. Piège : sans SAN, les navigateurs modernes rejettent le cert.

Créer un certificat auto-signé valide 1 an

terminal
openssl x509 -req -days 365 -in example.csr -signkey private-rsa-unencrypted.key -out example.crt -extensions v3_req -extfile san.cnf
openssl x509 -in example.crt -text -noout | grep -A5 'Subject Alternative Name'

Signe le CSR avec la clé privée pour un cert racine auto-signé (ok pour dev/staging). -days 365 pour 1 an ; la vérif affiche SAN. En prod, remplacez par CA externe comme Let's Encrypt. Piège : dates d'expiration courtes cassent les tests CI/CD.

Passer à l'ECC pour la performance

RSA est sûr mais lent ; ECC (Elliptic Curve Cryptography) offre l'équivalent sécurité avec clés 10x plus courtes. En 2026, prime256v1 ou secp384r1 sont standards pour TLS 1.3. Analogie : RSA = camion blindé, ECC = moto agile.

Générer clé ECC et certificat

terminal
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:secp384r1 -out private-ecc.key
openssl req -new -key private-ecc.key -out example-ecc.csr -subj "/C=FR/ST=Paris/L=Paris/O=Learni/OU=Dev/CN=ecc.example.com" -addext "subjectAltName=DNS:ecc.example.com"
openssl x509 -req -days 365 -in example-ecc.csr -signkey private-ecc.key -out example-ecc.crt

Génère clé ECC secp384r1 (NIST-approved), CSR avec -addext (OpenSSL 1.1.1+), puis cert. Plus rapide pour handshakes TLS. Vérifiez : openssl ec -in private-ecc.key -text -noout. Piège : courbes non-standard comme brainpool cassent l'interop Chrome.

Convertir en PKCS12 pour Java/Node

terminal
openssl pkcs12 -export -out keystore.p12 -inkey private-rsa-unencrypted.key -in example.crt -certfile ca.crt -passout pass:SuperSecretPass2026
openssl pkcs12 -in keystore.p12 -info -noout -passin pass:SuperSecretPass2026

Bundle clé + cert en .p12 chiffré (utilisable par keystores Java, NODE_EXTRA_CA_CERTS). Ajoutez -certfile pour chaines CA. La vérif liste contenus. Piège : passphrase faible exposée en clair dans scripts ; utilisez vars d'env.

Configuration OpenSSL.cnf personnalisée

openssl.cnf
[ req ]
default_bits       = 4096
prompt             = no
distinguished_name = req_distinguished_name
req_extensions     = req_ext

[ req_distinguished_name ]
C                  = FR
ST                 = Paris
L                  = Paris
O                  = Learni Group
OU                 = DevOps
CN                 = localhost

[ req_ext ]
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = localhost
DNS.2 = 127.0.0.1
IP.1  = 127.0.0.1

Ce openssl.cnf complet automatise les CSR avec defaults (CN=localhost pour dev local). Utilisez avec openssl req -new -key private.key -out csr.csr -config openssl.cnf. Personnalisez pour prod. Piège : chemin absolu vers cnf manquant casse les validations.

Vérifier et révoquer un certificat

terminal
openssl verify -CAfile example.crt example-ecc.crt
openssl x509 -in example.crt -serial -noout
openssl ca -revoked example.crt -keyfile private-rsa-unencrypted.key -cert example.crt -config openssl.cnf

Vérifie chaîne (auto-signé = ok), extrait serial, simule révocation CA (pour PKI). Nécessite index/CRL setup pour vrai CA. Piège : sans -CAfile, vérif échoue sur self-signed ; toujours checker expiry avec openssl x509 -enddate -noout.

Bonnes pratiques

  • Toujours chiffrer les clés privées au repos (-aes256), dé-chiffrer only in-memory sur serveurs.
  • Utilisez ECC secp384r1 ou Ed25519 pour new setups ; RSA 4096 fallback.
  • Activez HSTS et OCSP Stapling post-cert ; testez avec openssl s_client -connect example.com:443.
  • Backup atomique : tar clé+cert+cnf ; gérez CRL pour révocations.
  • Intégrez en CI/CD : GitHub Actions avec OpenSSL Docker image.

Erreurs courantes à éviter

  • Clés trop courtes (<3072 RSA) : vulnérables à Shor's algorithm quantum (post-2030 threat).
  • Oubli SAN/DNS : ERR_CERT_COMMON_NAME_INVALID sur Chrome/Firefox.
  • Passphrase en clair dans scripts : utilisez openssl rand -base64 + secrets manager (Vault/AWS SSM).
  • Versions OpenSSL vulnérables (ex Heartbleed) : pin à openssl 3.3+ et openssl update -check.

Pour aller plus loin