🔝 Retour au Sommaire
SSL (Secure Sockets Layer) et son successeur TLS (Transport Layer Security) sont des protocoles cryptographiques qui permettent de sécuriser les communications sur Internet. Ils sont essentiels pour protéger les données sensibles comme les mots de passe, les informations bancaires, ou toute information confidentielle transitant sur le réseau.
Aujourd'hui, pratiquement toutes les applications web professionnelles utilisent HTTPS (HTTP + TLS), et il est devenu indispensable de maîtriser la configuration SSL/TLS pour développer des applications sécurisées.
SSL (Secure Sockets Layer)
- Créé par Netscape dans les années 1990
- Dernière version : SSL 3.0 (1996)
- Obsolète et dangereux - ne plus utiliser !
TLS (Transport Layer Security)
- Successeur de SSL (depuis 1999)
- Versions actuelles :
- TLS 1.2 (2008) - Encore largement utilisé
- TLS 1.3 (2018) - Recommandé, plus rapide et sécurisé
Note : Par habitude, on parle souvent de "SSL" alors qu'on utilise en réalité TLS. Dans ce tutoriel, nous utiliserons TLS pour la configuration actuelle.
Sans SSL/TLS (HTTP) Avec SSL/TLS (HTTPS)
───────────────────── ─────────────────────
Client ──[texte clair]──> Serveur Client ──[chiffré]──> Serveur
▲
Pirate peut lire : │
- Mots de passe Pirate ne peut pas
- Données bancaires déchiffrer les données
- Informations personnelles └─── Sécurisé
Avantages de SSL/TLS :
-
Confidentialité 🔒
- Les données sont chiffrées
- Impossible de lire le contenu intercepté
-
Intégrité ✅
- Détection de toute modification
- Les données ne peuvent pas être altérées
-
Authentification 🆔
- Vérification de l'identité du serveur
- Le client sait à qui il parle
-
Confiance 👍
- Cadenas vert dans le navigateur
- Meilleur référencement Google (SEO)
Lorsqu'un client se connecte à un serveur HTTPS, voici ce qui se passe :
Client Serveur
│ │
│────── 1. Client Hello ──────────────────>│
│ (Versions TLS supportées, │
│ algorithmes de chiffrement) │
│ │
│<────── 2. Server Hello ──────────────────│
│ (Version TLS choisie, │
│ algorithme choisi, │
│ Certificat du serveur) │
│ │
│── 3. Vérification du certificat ─────────│
│ (Autorité de certification valide ?) │
│ │
│────── 4. Génération de clé ─────────────>│
│ (Clé de session chiffrée │
│ avec la clé publique) │
│ │
│<────── 5. Confirmation ──────────────────│
│ │
│══════ 6. Communication chiffrée ═════════│
│ (Avec la clé de session) │
Étapes détaillées :
- Client Hello : Le client envoie ses capacités (versions TLS, algorithmes)
- Server Hello : Le serveur répond avec ses choix et son certificat
- Vérification : Le client vérifie que le certificat est valide
- Échange de clés : Génération d'une clé de session unique
- Confirmation : Les deux parties confirment le chiffrement
- Communication : Tout le trafic est maintenant chiffré
Un certificat SSL/TLS est comme une carte d'identité pour un site web :
Certificat SSL/TLS
├─ Nom de domaine (example.com)
├─ Nom de l'organisation
├─ Clé publique
├─ Date de validité (début et fin)
├─ Autorité de certification (CA)
└─ Signature numérique
Types de certificats :
| Type | Validation | Utilisation | Prix |
|---|---|---|---|
| DV (Domain Validation) | Rapide (minutes) | Sites personnels, blogs | Gratuit - 50€/an |
| OV (Organization Validation) | Moyenne (quelques jours) | Sites d'entreprise | 50€ - 200€/an |
| EV (Extended Validation) | Complète (semaines) | Banques, e-commerce | 200€ - 500€/an |
Exemples d'autorités de certification (CA) :
- Let's Encrypt (gratuit, automatisé)
- DigiCert
- GlobalSign
- Comodo
- GoDaddy
Root CA (Racine)
│
└─> Intermediate CA (Intermédiaire)
│
└─> Certificat de votre serveur
Les navigateurs font confiance aux Root CA préinstallées. Votre certificat doit être signé par une CA de confiance pour que les navigateurs l'acceptent.
Une seule clé pour chiffrer ET déchiffrer
Alice Bob
│ │
│── Clé partagée : "ABC123" ───│
│ │
│── Chiffré avec ABC123 ──────>│
│ │
│ Déchiffré avec ABC123
Algorithmes : AES, ChaCha20
Problème : Comment partager la clé de manière sécurisée ?
Deux clés : publique (pour chiffrer) et privée (pour déchiffrer)
Alice Bob
│ │
│<── Clé publique de Bob ──────│
│ │
│── Chiffré avec clé publique >│
│ │
│ Déchiffré avec clé privée
Algorithmes : RSA, ECDSA
TLS utilise les deux :
- Asymétrique pour échanger la clé de session
- Symétrique pour chiffrer les données (plus rapide)
Pour vérifier l'intégrité :
Message → [Hachage] → Empreinte unique
"Hello" → SHA-256 → 185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969
Propriétés :
- Toujours la même empreinte pour le même message
- Impossible de retrouver le message depuis l'empreinte
- La moindre modification change complètement l'empreinte
Algorithmes courants :
- SHA-256 (recommandé)
- SHA-384
- SHA-512
Pour prouver l'authenticité :
1. Serveur hache le message
2. Serveur chiffre le hash avec sa clé privée = Signature
3. Client déchiffre la signature avec la clé publique
4. Client hache le message de son côté
5. Comparaison : les hashs correspondent ? Authentique !
OpenSSL est la bibliothèque open-source la plus utilisée pour SSL/TLS. Elle est disponible sur toutes les plateformes et FreePascal peut l'utiliser facilement.
| Version | Sortie | Support | Notes |
|---|---|---|---|
| 1.0.2 | 2015 | Fin 2019 | ❌ Obsolète |
| 1.1.0 | 2016 | Fin 2019 | ❌ Obsolète |
| 1.1.1 | 2018 | Sept 2023 | |
| 3.0.x | 2021 | Sept 2026 | ✅ Actuel |
| 3.1.x | 2023 | Mars 2025 | ✅ Actuel |
Recommandation : Utilisez OpenSSL 3.0+ pour les nouveaux projets, ou au minimum 1.1.1 (LTS).
OpenSSL
├─ libssl → Protocoles SSL/TLS
├─ libcrypto → Algorithmes cryptographiques
└─ openssl → Outil en ligne de commande
Fichiers principaux :
Windows :
libssl-3.dll(oussleay32.dllpour 1.1.1)libcrypto-3.dll(oulibeay32.dllpour 1.1.1)
Linux :
libssl.so.3(oulibssl.so.1.1)libcrypto.so.3(oulibcrypto.so.1.1)
Avantages :
- ✅ Gratuit
- ✅ Rapide à créer
- ✅ Parfait pour le développement et les tests
- ✅ Bon pour les réseaux internes
Inconvénients :
- ❌ Avertissement de sécurité dans les navigateurs
- ❌ Pas de chaîne de confiance
- ❌ Ne convient PAS pour la production publique
Utilisation :
# Création d'un certificat auto-signé
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodesAvantages :
- ✅ Reconnus par tous les navigateurs
- ✅ Pas d'avertissement de sécurité
- ✅ Chaîne de confiance établie
- ✅ Convient pour la production
Inconvénients :
- ❌ Coût (sauf Let's Encrypt)
- ❌ Processus de validation
- ❌ Renouvellement périodique
Let's Encrypt (gratuit) :
# Installation de certbot
sudo apt install certbot
# Obtention d'un certificat
sudo certbot certonly --standalone -d example.comSSL/TLS utilise plusieurs formats de fichiers :
| Format | Extension | Description | Usage |
|---|---|---|---|
| PEM | .pem, .crt, .key | Base64, lisible | Le plus courant |
| DER | .der, .cer | Binaire | Windows |
| PKCS#12 | .p12, .pfx | Archive (cert + clé) | Windows, échange |
| PKCS#7 | .p7b, .p7c | Certificats seulement | Chaînes |
-----BEGIN CERTIFICATE-----
MIIDXTCCAkWgAwIBAgIJAKJ5...
(contenu encodé en Base64)
...KJ5vQ==
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0...
(clé privée encodée)
...9w0BAQ==
-----END PRIVATE KEY-----
Avantages du PEM :
- Lisible en texte (Base64)
- Peut contenir plusieurs certificats
- Compatible avec OpenSSL et la plupart des outils
# PEM vers DER
openssl x509 -in cert.pem -outform DER -out cert.der
# DER vers PEM
openssl x509 -in cert.der -inform DER -out cert.pem
# PEM vers PKCS#12
openssl pkcs12 -export -in cert.pem -inkey key.pem -out cert.p12
# PKCS#12 vers PEM
openssl pkcs12 -in cert.p12 -out cert.pem -nodesHistorique et recommandations :
SSL 2.0 (1995) → ❌ Obsolète, dangereux
SSL 3.0 (1996) → ❌ Vulnérable (POODLE)
TLS 1.0 (1999) → ❌ Déprécié
TLS 1.1 (2006) → ⚠️ À éviter
TLS 1.2 (2008) → ✅ Recommandé (minimum)
TLS 1.3 (2018) → ✅ Recommandé (idéal)
Configuration recommandée :
Minimum : TLS 1.2
Préféré : TLS 1.3
Une cipher suite est une combinaison d'algorithmes utilisés pour sécuriser la connexion :
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
│ │ │ │ │ │
│ │ │ │ │ └─ Hash (SHA-256)
│ │ │ │ └───── Mode (GCM)
│ │ │ └───────────── Chiffrement (AES-128)
│ │ └───────────────────── Signature (RSA)
│ └─────────────────────────── Échange de clés (ECDHE)
└─────────────────────────────── Protocole (TLS)
Cipher suites recommandées (2024) :
Pour TLS 1.3 :
TLS_AES_256_GCM_SHA384
TLS_AES_128_GCM_SHA256
TLS_CHACHA20_POLY1305_SHA256
Pour TLS 1.2 :
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
À éviter :
- Tout ce qui contient
RC4,MD5,DES,3DES - Cipher suites sans Forward Secrecy (sans
DHEouECDHE) - Export cipher suites
Lorsqu'un client se connecte, il doit vérifier :
-
Validité temporelle
- Le certificat n'est pas expiré
- Il est déjà valide
-
Autorité de certification
- Le certificat est signé par une CA de confiance
- La chaîne de certificats est valide
-
Nom de domaine
- Le Common Name (CN) ou Subject Alternative Name (SAN) correspond
- Wildcards :
*.example.comcorrespond àwww.example.com
-
Révocation
- Le certificat n'a pas été révoqué (CRL ou OCSP)
# Voir les détails d'un certificat
openssl x509 -in cert.pem -text -noout
# Vérifier la validité d'un certificat
openssl verify -CAfile ca-bundle.crt cert.pem
# Tester une connexion SSL/TLS
openssl s_client -connect example.com:443 -showcerts✅ Faire :
- Utiliser TLS 1.2 minimum (TLS 1.3 si possible)
- Désactiver SSL 2.0, SSL 3.0, TLS 1.0, TLS 1.1
- Utiliser des cipher suites fortes (AES-GCM, ChaCha20)
- Activer Forward Secrecy (ECDHE)
- Utiliser des certificats de 2048 bits minimum (RSA) ou 256 bits (ECDSA)
- Renouveler les certificats avant expiration
- Implémenter HSTS (HTTP Strict Transport Security)
- Valider tous les certificats côté client
- Stocker les clés privées de manière sécurisée
- Utiliser des permissions restrictives sur les fichiers de clés
❌ Ne pas faire :
- Utiliser SSL 3.0 ou TLS 1.0
- Accepter des certificats auto-signés en production
- Désactiver la vérification de certificat
- Utiliser des cipher suites faibles (RC4, DES, MD5)
- Partager ou exposer les clés privées
- Laisser les certificats expirer
- Utiliser des clés RSA < 2048 bits
- Ignorer les avertissements de sécurité
# Linux/Ubuntu
chmod 600 private-key.pem # Lecture seule par le propriétaire
chmod 644 certificate.pem # Lecture par tous
# Propriétaire
chown www-data:www-data *.pem# Windows
icacls private-key.pem /inheritance:r /grant:r "%USERNAME%:F"-
SSL Labs Server Test
- https://www.ssllabs.com/ssltest/
- Analyse complète de la configuration SSL/TLS
- Note de A+ à F
-
Security Headers
- https://securityheaders.com/
- Vérification des en-têtes de sécurité HTTP
-
Certificate Transparency
- https://crt.sh/
- Recherche de certificats émis pour votre domaine
# nmap (scan SSL/TLS)
nmap --script ssl-enum-ciphers -p 443 example.com
# testssl.sh (audit complet)
./testssl.sh https://example.com
# sslyze (analyse Python)
sslyze --regular example.com:443SSL/TLS ajoute un surcoût :
Sans SSL/TLS :
├─ Connexion TCP : ~50ms
└─ Requête HTTP : ~10ms
Total : ~60ms
Avec SSL/TLS :
├─ Connexion TCP : ~50ms
├─ Handshake TLS : ~100-200ms (première fois)
└─ Requête HTTP : ~10ms
Total : ~160-260ms (première connexion)
Optimisations :
-
Session Resumption
- Réutiliser les sessions TLS
- Économie de 1 RTT (Round-Trip Time)
-
TLS 1.3
- Handshake plus rapide (1-RTT)
- 0-RTT possible (early data)
-
Certificate Pinning
- Éviter la validation complète de la chaîne
-
OCSP Stapling
- Le serveur fournit la preuve de non-révocation
- Évite une requête OCSP supplémentaire
-
HTTP/2
- Multiplexage sur une seule connexion TLS
Client (Navigateur)
│
├─ HTTPS (port 443)
↓
Serveur Web + TLS
│
└─ Application FreePascal
Application Mobile
│
├─ HTTPS + API Key
↓
API Server + TLS
│
└─ Base de données
Client Desktop
│
├─ TLS Socket
↓
Serveur Backend
Client Email
│
├─ SMTPS (port 465) ou STARTTLS (port 587)
↓
Serveur SMTP + TLS
Cette section couvre tous les aspects de SSL/TLS avec FreePascal :
10.5.1 : OpenSSL sur Windows - Installation et configuration
10.5.2 : OpenSSL sur Ubuntu - Installation et configuration
10.5.3 : Génération de certificats - Auto-signés et Let's Encrypt
10.5.4 : Configuration Synapse SSL - Utilisation avec Synapse
10.5.5 : Configuration Indy SSL - Utilisation avec Indy
10.5.6 : Validation de certificats - Vérification et sécurité
10.5.7 : Pinning de certificats - Sécurité renforcée
10.5.8 : Debugging SSL/TLS - Résolution de problèmes
Avant de commencer cette section, vous devriez :
- ✅ Connaître les bases de la programmation réseau (chapitre 10.1-10.4)
- ✅ Comprendre HTTP/HTTPS
- ✅ Savoir utiliser la ligne de commande (terminal)
- ✅ Avoir des notions basiques de cryptographie
- ✅ Être à l'aise avec la compilation de programmes
- La sécurité est un sujet complexe et en constante évolution
- Ce tutoriel couvre les bases, mais consultez toujours les recommandations actuelles
- Pour des applications critiques, faites appel à des experts en sécurité
- Ne jamais désactiver les vérifications de sécurité en production
- Gardez vos bibliothèques SSL/TLS à jour
🔒 Règle d'or : En cas de doute sur la sécurité, soyez restrictif plutôt que permissif !
Maintenant que vous comprenez les fondamentaux de SSL/TLS, voyons comment l'installer et le configurer sur vos systèmes.