X.509 est le standard international qui définit le format des certificats à clé publique. C’est le format utilisé par TLS/HTTPS, mTLS, S/MIME et la plupart des PKI modernes.

Pour le rôle des certificats dans TLS, voir TLS et SSL. Pour la hiérarchie des CA, voir PKI — Infrastructure à Clés Publiques.


Structure complète d’un certificat X.509

Certificate ::= {
  tbsCertificate          ← "to be signed" — le contenu signé
  signatureAlgorithm      ← algorithme utilisé par la CA pour signer
  signatureValue          ← signature de la CA sur tbsCertificate
}

tbsCertificate ::= {
  version                 ← v3 (le plus courant)
  serialNumber            ← numéro unique dans le namespace de la CA
  signature               ← algo de signature (doit correspondre à signatureAlgorithm)
  issuer                  ← Distinguished Name de la CA émettrice
  validity {
    notBefore             ← date de début de validité
    notAfter              ← date d'expiration
  }
  subject                 ← Distinguished Name du titulaire
  subjectPublicKeyInfo {
    algorithm             ← RSA / ECDSA / Ed25519…
    subjectPublicKey      ← la clé publique elle-même
  }
  extensions              ← champs v3 (SAN, KeyUsage, OCSP…)
}

Les champs importants en détail

Subject et Issuer — Distinguished Name (DN)

CN  = Common Name          → le domaine ou l'identité principale
O   = Organization         → nom de l'organisation
OU  = Organizational Unit  → service / département
C   = Country              → code pays ISO 3166 (FR, US…)
ST  = State / Province     → région
L   = Locality             → ville

Exemple :
  Subject: CN=api.monentreprise.fr, O=Mon Entreprise SAS, C=FR
  Issuer:  CN=R3, O=Let's Encrypt, C=US

Validity — durée de validité

# Lire les dates d'un certificat
openssl x509 -in cert.pem -noout -dates
# notBefore=Jan  1 00:00:00 2026 GMT
# notAfter =Apr  1 00:00:00 2026 GMT
 
# Durées typiques :
# Let's Encrypt : 90 jours  ← force le renouvellement fréquent
# CA commerciales : 1 an    ← maximum depuis 2020
# PKI interne : variable    ← souvent 1-3 ans
# CA racine : 20-30 ans

SubjectPublicKeyInfo — la clé publique

AlgorithmeTaille de cléRecommandation
RSA2048 bits (minimum), 4096Compatible universel, plus lent
ECDSA P-256256 bits ≈ RSA 3072Recommandé — rapide, compact
ECDSA P-384384 bits ≈ RSA 7680Pour contextes haute sécurité
Ed25519256 bitsTrès rapide, signature déterministe

Extensions X.509 v3

Les extensions enrichissent le certificat avec des contraintes et des métadonnées.

Subject Alternative Names (SAN) — critique

Extension : subjectAltName
  DNS:monentreprise.fr
  DNS:www.monentreprise.fr
  DNS:api.monentreprise.fr
  IP:93.184.1.10           ← adresse IP directe (rare mais possible)
  email:admin@exemple.com  ← pour les certificats S/MIME

Depuis 2017, le champ CN est ignoré par les navigateurs — seuls les SAN font foi.

Key Usage — ce que la clé peut faire

KeyUsage (doit être marquée Critical) :
  digitalSignature      → signer des données
  keyEncipherment       → chiffrer une clé de session (RSA key exchange)
  keyAgreement          → échange de clé DH (ECDH)
  keyCertSign           → signer d'autres certificats (CA uniquement)
  cRLSign               → signer des CRL (CA uniquement)

Extended Key Usage — usage applicatif

ExtendedKeyUsage :
  serverAuth      → TLS serveur (HTTPS)
  clientAuth      → TLS client (mTLS)
  emailProtection → S/MIME
  codeSigning     → signature de code
  timeStamping    → horodatage

Basic Constraints — est-ce une CA ?

BasicConstraints (Critical) :
  CA: TRUE   → ce certificat peut signer d'autres certificats
  CA: FALSE  → certificat final (end-entity), ne peut pas signer

PathLength:    → nombre maximum de CA intermédiaires sous cette CA
  0            → peut signer uniquement des end-entity certificates
  1            → peut signer une CA intermédiaire, qui signe les end-entity

Authority Information Access (AIA)

AuthorityInfoAccess :
  OCSP - URI: http://ocsp.digicert.com        ← où vérifier la révocation en temps réel
  CA Issuers - URI: http://ca.digicert.com/r3 ← où télécharger le cert de la CA intermédiaire

Subject Key Identifier & Authority Key Identifier

SubjectKeyIdentifier:
  3A:B4:E2:...   ← empreinte de la clé publique de ce certificat

AuthorityKeyIdentifier:
  keyIdentifier: 3A:B4:E2:...  ← empreinte de la clé de la CA émettrice

Ces identifiants permettent de construire la chaîne sans se baser uniquement sur les DN.


Formats de fichiers

ExtensionFormatContenuUsage
.pemBase64 + headers -----BEGINCert, clé, ou les deuxLinux, nginx, openssl
.crt / .cerPEM ou DERCertificat uniquementVaries
.keyPEMClé privée uniquementLinux
.derBinaireCert ou cléJava, Windows
.p12 / .pfxBinaire PKCS#12Cert + clé privée + chaîneWindows, Java
.p7bPEM PKCS#7Chaîne de certificatsWindows
.csrPEM PKCS#10Certificate Signing RequestSoumission à une CA
# Conversions courantes avec openssl
 
# PEM → DER
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 (cert + clé + chaîne)
openssl pkcs12 -export -in cert.pem -inkey key.pem \
  -certfile chain.pem -out bundle.p12
 
# PKCS#12 → PEM
openssl pkcs12 -in bundle.p12 -nodes -out bundle.pem

Lire un certificat avec openssl

# Lire le certificat d'un serveur distant
openssl s_client -connect monentreprise.fr:443 -servername monentreprise.fr \
  2>/dev/null | openssl x509 -noout -text
 
# Lire un fichier certificat
openssl x509 -in cert.pem -noout -text
 
# Extraits rapides
openssl x509 -in cert.pem -noout -subject        # qui est-ce ?
openssl x509 -in cert.pem -noout -issuer         # qui a signé ?
openssl x509 -in cert.pem -noout -dates          # validité
openssl x509 -in cert.pem -noout -fingerprint -sha256  # empreinte SHA-256
openssl x509 -in cert.pem -noout -ext subjectAltName   # domaines couverts
 
# Vérifier la chaîne de confiance
openssl verify -CAfile chain.pem cert.pem

Exemple de certificat décodé (github.com)

Certificate:
  Data:
    Version: 3 (0x2)
    Serial Number: 04:d3:3b:6c:...
    Signature Algorithm: sha256WithRSAEncryption
    Issuer: C=US, O=DigiCert Inc, CN=DigiCert TLS Hybrid ECC SHA384 2020 CA1
    Validity:
      Not Before: Mar  7 00:00:00 2025 GMT
      Not After : Mar  8 23:59:59 2026 GMT
    Subject: C=US, ST=California, L=San Francisco, O=GitHub, Inc., CN=github.com
    Subject Public Key Info:
      Public Key Algorithm: id-ecPublicKey
        Public-Key: (256 bit)  ← ECDSA P-256
    X509v3 extensions:
      X509v3 Subject Alternative Name:
        DNS:github.com, DNS:www.github.com
      X509v3 Key Usage: critical
        Digital Signature
      X509v3 Extended Key Usage:
        TLS Web Server Authentication, TLS Web Client Authentication
      X509v3 Basic Constraints: critical
        CA:FALSE
      Authority Information Access:
        OCSP - URI:http://ocsp.digicert.com
        CA Issuers - URI:http://cacerts.digicert.com/...

En relation avec