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
openssl version -a
openssl list -1 -cipher-algorithms | head -5
openssl rand -hex 32Cette 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
openssl genpkey -algorithm RSA -out private-rsa.key -aes256
openssl rsa -in private-rsa.key -out private-rsa-unencrypted.key -passin pass:SuperSecretPass2026La 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)
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
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
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.crtGé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
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:SuperSecretPass2026Bundle 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
[ 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.1Ce 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
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.cnfVé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_INVALIDsur 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+etopenssl update -check.
Pour aller plus loin
- Documentation officielle : OpenSSL Man Pages.
- Outils avancés : step-ca pour PKI auto-hébergée.
- Formations : Découvrez nos formations Learni sur la sécurité DevOps.
- Pratique : intégrez à Docker Compose pour HTTPS local (
nginx:alpine).