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 -noout

openssl — 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.crt

openssl — 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.key

openssl — 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.key

openssl — 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.pem

openssl — 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.pem

certbot — 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ée

Recettes 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}"
done

En relation avec