Commandes openssl et autres outils pour générer, inspecter, tester et convertir des certificats.
Sujets associés : TLS et SSL, Certificats — Vue d’ensemble, X.509 — Format des certificats, PKI — Infrastructure à Clés Publiques, Cycle de vie et révocation
openssl — inspection de certificats
# Afficher le contenu d'un certificat PEM en clair
openssl x509 -in certificat.pem -text -noout
# Afficher seulement les informations importantes
openssl x509 -in certificat.pem -noout -subject -issuer -dates -serial
# Vérifier la date d'expiration
openssl x509 -in certificat.pem -noout -enddate
openssl x509 -in certificat.pem -noout -dates
# Afficher les SANs (Subject Alternative Names)
openssl x509 -in certificat.pem -noout -ext subjectAltName
# Afficher l'empreinte (fingerprint)
openssl x509 -in certificat.pem -noout -fingerprint -sha256
# Vérifier qu'un certificat correspond à une clé privée
# (les modulus doivent être identiques)
openssl x509 -noout -modulus -in cert.pem | md5sum
openssl rsa -noout -modulus -in key.pem | md5sum
# Lire un certificat DER (binaire)
openssl x509 -in certificat.der -inform DER -text -nooutopenssl — connexion TLS / test serveur
# Connexion TLS et affichage du certificat serveur
openssl s_client -connect google.com:443
# Connexion avec SNI (nécessaire si le serveur héberge plusieurs domaines)
openssl s_client -connect google.com:443 -servername google.com
# Afficher la chaîne de certificats complète
openssl s_client -connect google.com:443 -showcerts
# Connexion TLS 1.2 / 1.3 forcée
openssl s_client -connect google.com:443 -tls1_2
openssl s_client -connect google.com:443 -tls1_3
# Tester STARTTLS (SMTP, IMAP, FTP…)
openssl s_client -connect mail.exemple.com:587 -starttls smtp
openssl s_client -connect mail.exemple.com:993 -starttls imap
# Vérifier la date d'expiration d'un certificat distant
echo | openssl s_client -connect google.com:443 -servername google.com 2>/dev/null \
| openssl x509 -noout -dates
# Extraire le certificat distant dans un fichier
echo | openssl s_client -connect google.com:443 -servername google.com 2>/dev/null \
| openssl x509 > google.pem
# Test mTLS (client certificate)
openssl s_client -connect api.exemple.com:443 \
-cert client.crt \
-key client.key \
-CAfile ca.crtopenssl — génération de clés
# Générer une clé RSA 4096 bits
openssl genrsa -out private.key 4096
# Générer une clé RSA chiffrée (protégée par passphrase)
openssl genrsa -aes256 -out private.key 4096
# Retirer la passphrase d'une clé
openssl rsa -in private-with-pass.key -out private.key
# Afficher le contenu d'une clé privée RSA
openssl rsa -in private.key -text -noout
# Générer une clé ECDSA (P-256, plus rapide que RSA)
openssl ecparam -name prime256v1 -genkey -noout -out ec-private.key
# Générer une clé ECDSA P-384
openssl ecparam -name secp384r1 -genkey -noout -out ec-private.key
# Extraire la clé publique depuis une clé privée
openssl rsa -in private.key -pubout -out public.keyopenssl — CSR (Certificate Signing Request)
# Générer une clé + CSR en une commande
openssl req -new -newkey rsa:4096 -nodes \
-keyout private.key \
-out demande.csr \
-subj "/C=FR/ST=Ile-de-France/L=Paris/O=Mon Entreprise/CN=exemple.com"
# Générer un CSR depuis une clé existante
openssl req -new -key private.key -out demande.csr
# CSR avec SANs (Subject Alternative Names) via fichier de config
cat > san.cnf <<EOF
[req]
default_bits = 4096
prompt = no
distinguished_name = dn
req_extensions = req_ext
[dn]
C=FR
ST=Ile-de-France
L=Paris
O=Mon Entreprise
CN=exemple.com
[req_ext]
subjectAltName = @alt_names
[alt_names]
DNS.1 = exemple.com
DNS.2 = www.exemple.com
DNS.3 = api.exemple.com
IP.1 = 192.168.1.50
EOF
openssl req -new -key private.key -out demande.csr -config san.cnf
# Afficher le contenu d'un CSR
openssl req -in demande.csr -text -noout
# Vérifier le CSR
openssl req -verify -in demande.csr -key private.keyopenssl — PKI privée / auto-signature
# Créer un certificat auto-signé (dev uniquement)
openssl req -x509 -newkey rsa:4096 -nodes \
-keyout private.key \
-out certificat.pem \
-days 365 \
-subj "/CN=localhost"
# Créer une CA privée (Root CA)
openssl req -x509 -newkey rsa:4096 -nodes \
-keyout ca.key \
-out ca.crt \
-days 3650 \
-subj "/CN=Ma CA Privee"
# Signer un CSR avec la CA privée
openssl x509 -req \
-in demande.csr \
-CA ca.crt -CAkey ca.key \
-CAcreateserial \
-out certificat.pem \
-days 365
# Signer avec extensions (SAN inclus)
openssl x509 -req \
-in demande.csr \
-CA ca.crt -CAkey ca.key \
-CAcreateserial \
-out certificat.pem \
-days 365 \
-extfile san.cnf \
-extensions req_ext
# Vérifier la chaîne de confiance
openssl verify -CAfile ca.crt certificat.pem
openssl verify -CAfile ca-bundle.crt -untrusted intermediate.crt certificat.pemopenssl — conversions de formats
# PEM → DER (binaire)
openssl x509 -in cert.pem -outform DER -out cert.der
# DER → PEM
openssl x509 -in cert.der -inform DER -outform PEM -out cert.pem
# PEM → PKCS#12 / PFX (certificat + clé + chaîne)
openssl pkcs12 -export \
-out bundle.p12 \
-inkey private.key \
-in cert.pem \
-certfile ca.crt
# PKCS#12 → PEM
openssl pkcs12 -in bundle.p12 -out bundle.pem -nodes
# Extraire seulement le certificat d'un P12
openssl pkcs12 -in bundle.p12 -nokeys -out cert.pem
# Extraire seulement la clé d'un P12
openssl pkcs12 -in bundle.p12 -nocerts -nodes -out key.pem
# Concaténer fullchain (cert + intermediate + root)
cat cert.pem intermediate.pem root.pem > fullchain.pemcertbot — Let’s Encrypt
# Obtenir un certificat (mode standalone, port 80 libéré)
sudo certbot certonly --standalone -d exemple.com -d www.exemple.com
# Obtenir un certificat (mode webroot, serveur web déjà actif)
sudo certbot certonly --webroot -w /var/www/html -d exemple.com
# Obtenir un certificat wildcard (challenge DNS requis)
sudo certbot certonly --manual --preferred-challenges dns -d "*.exemple.com"
# Renouveler tous les certificats
sudo certbot renew
# Renouveler en mode dry-run (test sans écriture)
sudo certbot renew --dry-run
# Lister les certificats gérés
sudo certbot certificates
# Révoquer un certificat
sudo certbot revoke --cert-path /etc/letsencrypt/live/exemple.com/cert.pem
# Fichiers générés par certbot
ls /etc/letsencrypt/live/exemple.com/
# cert.pem ← certificat du domaine
# chain.pem ← chaîne intermédiaire
# fullchain.pem ← cert.pem + chain.pem (à utiliser dans NGINX/Apache)
# privkey.pem ← clé privéeRecettes complètes
# Vérifier l'expiration d'un certificat distant avec alerte
EXPIRY=$(echo | openssl s_client -connect $HOST:443 -servername $HOST 2>/dev/null \
| openssl x509 -noout -enddate | cut -d= -f2)
echo "$HOST expire le : $EXPIRY"
# Vérifier si un port écoute en TLS
timeout 3 openssl s_client -connect $HOST:$PORT -servername $HOST < /dev/null 2>&1 \
| grep -E "Verify|subject|issuer|expire"
# Script de monitoring expiration
for domain in exemple.com api.exemple.com; do
echo | openssl s_client -connect ${domain}:443 -servername ${domain} 2>/dev/null \
| openssl x509 -noout -dates \
| grep notAfter \
| awk -F= "{print \"$domain: \" \$2}"
doneEn relation avec
- Linux Réseau — Vue d’ensemble — index des commandes réseau Linux
- TLS et SSL — fonctionnement TLS, mTLS, handshake
- X.509 — Format des certificats — structure des champs openssl
- PKI — Infrastructure à Clés Publiques — hiérarchie CA, trust store
- Cycle de vie et révocation — CSR, émission, renouvellement
- Let’s Encrypt et ACME — certbot, challenges
- HTTP et APIs — Commandes — curl avec TLS et mTLS