🔝 Retour au Sommaire
Dans le monde connecté d'aujourd'hui, la sécurisation des communications réseau est absolument essentielle. Que vous développiez un client web, un serveur API, ou une application qui communique avec des services distants, vous devez protéger les données en transit contre l'interception et la modification.
TLS/SSL (Transport Layer Security / Secure Sockets Layer) est le standard de facto pour sécuriser les communications sur Internet. OpenSSL est la bibliothèque la plus utilisée pour implémenter ces protocoles, et elle est disponible sur toutes les plateformes majeures, y compris Windows et Linux.
SSL a été développé par Netscape dans les années 1990 pour sécuriser les communications web. Il a connu plusieurs versions :
- SSL 1.0 (jamais publié publiquement)
- SSL 2.0 (1995) - Obsolète et non sécurisé
- SSL 3.0 (1996) - Obsolète et non sécurisé
TLS est le successeur de SSL, standardisé par l'IETF :
- TLS 1.0 (1999) - Basé sur SSL 3.0
- TLS 1.1 (2006) - Déprécié
- TLS 1.2 (2008) - Encore largement utilisé
- TLS 1.3 (2018) - Version actuelle recommandée
Note importante : Bien qu'on parle souvent de "SSL", on utilise en réalité TLS dans les applications modernes. Le terme "SSL/TLS" ou simplement "TLS" est plus approprié.
TLS fournit trois garanties essentielles :
1. Confidentialité : Les données sont chiffrées, personne ne peut les lire en transit
Client → [Données chiffrées] → Serveur
↑ Attaquant ne peut pas lire ↑
2. Intégrité : Les données ne peuvent pas être modifiées sans détection
Si un attaquant modifie les données → Détection et rejet
3. Authentification : Vérification de l'identité du serveur (et optionnellement du client)
Client vérifie : "Est-ce vraiment le serveur de ma banque ?"
Lorsqu'un client se connecte à un serveur TLS, ils effectuent un "handshake" :
1. Client Hello
Client → Serveur : "Bonjour, je supporte TLS 1.3, 1.2..."
2. Server Hello
Serveur → Client : "OK, utilisons TLS 1.2"
Serveur → Client : [Certificat du serveur]
3. Vérification du certificat
Client vérifie : Le certificat est-il valide ?
Est-il signé par une autorité de confiance ?
Le nom correspond-il au serveur ?
4. Échange de clés
Client et Serveur : Négocient une clé de session partagée
5. Communication chiffrée
Client ↔ Serveur : Données chiffrées avec la clé de session
Un certificat numérique est comme une carte d'identité pour un serveur. Il contient :
- Le nom de domaine (exemple :
www.exemple.com) - La clé publique du serveur
- La période de validité
- L'autorité de certification (CA) qui l'a signé
Types de certificats :
- DV (Domain Validated) : Vérifie juste la propriété du domaine
- OV (Organization Validated) : Vérifie l'organisation
- EV (Extended Validation) : Vérification approfondie de l'organisation
Les CA sont des organisations de confiance qui signent les certificats :
- Let's Encrypt (gratuit, automatisé)
- DigiCert
- GlobalSign
- Comodo
Votre système d'exploitation et navigateur contiennent une liste de CA de confiance.
OpenSSL est une bibliothèque logicielle robuste et complète qui implémente :
- Les protocoles TLS/SSL
- Des algorithmes de chiffrement
- Des fonctions de hachage
- La gestion de certificats
- Et bien plus encore
- 1998 : Création du projet OpenSSL
- 2014 : Découverte de Heartbleed, une faille critique
- 2016 : Fork de LibreSSL (par OpenBSD) et BoringSSL (par Google)
- 2018 : Sortie d'OpenSSL 1.1.1 avec TLS 1.3
- 2021 : Sortie d'OpenSSL 3.0 avec nouvelle architecture
| Version | Date de sortie | Support | Recommandation |
|---|---|---|---|
| OpenSSL 1.0.2 | 2015 | Fin de vie (2019) | ❌ Ne plus utiliser |
| OpenSSL 1.1.0 | 2016 | Fin de vie (2019) | ❌ Ne plus utiliser |
| OpenSSL 1.1.1 | 2018 | LTS jusqu'en 2023 | |
| OpenSSL 3.0 | 2021 | LTS jusqu'en 2026 | ✅ Version actuelle |
| OpenSSL 3.1+ | 2023+ | Support standard | ✅ Dernières fonctionnalités |
1. Standard de l'industrie
- Utilisé par la majorité des serveurs web
- Largement testé et audité
- Support de tous les protocoles modernes
2. Multi-plateforme
- Disponible sur Windows, Linux, macOS, BSD, etc.
- Même API sur toutes les plateformes
- Code portable entre OS
3. Performance
- Implémentations optimisées
- Support des accélérateurs matériels (AES-NI)
- Utilisable en production
4. Fonctionnalités complètes
- Tous les algorithmes standards
- Gestion de certificats
- Support des formats standards (PEM, DER, PKCS#12)
LibreSSL
- Fork d'OpenSSL par OpenBSD
- Accent sur la sécurité et la simplicité
- API compatible avec OpenSSL 1.0.1
BoringSSL
- Fork par Google
- Optimisé pour Chrome et Android
- API non compatible, en évolution constante
mbedTLS (anciennement PolarSSL)
- Léger, conçu pour l'embarqué
- API différente d'OpenSSL
- Excellente documentation
GnuTLS
- Alternative complète à OpenSSL
- Licence LGPL
- API différente
Pour FreePascal/Lazarus, OpenSSL reste le choix recommandé car :
- Nombreux bindings disponibles
- Large communauté
- Documentation abondante
Dans le handshake TLS :
- Chiffrement asymétrique (RSA, ECDH) : Pour échanger la clé de session
- Chiffrement symétrique (AES, ChaCha20) : Pour chiffrer les données
Pourquoi cette combinaison ?
- Asymétrique : Sécurise l'échange de clés sans secret partagé préalable
- Symétrique : Beaucoup plus rapide pour chiffrer de grandes quantités de données
Une cipher suite définit les algorithmes utilisés pour :
- L'échange de clés (exemple : ECDHE)
- L'authentification (exemple : RSA)
- Le chiffrement (exemple : AES-256-GCM)
- L'intégrité (exemple : SHA-384)
Exemple de cipher suite : TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
Décomposition :
TLS: Protocole TLSECDHE: Échange de clés avec Elliptic Curve Diffie-Hellman EphemeralRSA: Authentification par RSAAES_256_GCM: Chiffrement AES 256 bits en mode GCMSHA384: Fonction de hachage SHA-384
Le PFS garantit que même si la clé privée du serveur est compromise, les sessions passées restent sécurisées.
Comment ? En utilisant des clés de session éphémères (temporaires) :
- Chaque session utilise une nouvelle clé
- Les clés ne sont jamais stockées
- Utilise ECDHE ou DHE
Cipher suites avec PFS :
TLS_ECDHE_*✅TLS_DHE_*✅TLS_RSA_*❌ (pas de PFS)
SNI permet d'héberger plusieurs sites HTTPS sur la même adresse IP.
Problème sans SNI :
IP 192.168.1.1 → Un seul certificat possible
Avec SNI :
IP 192.168.1.1 → Certificat pour site1.com
→ Certificat pour site2.com
→ Certificat pour site3.com
Le client indique le nom du site dans le handshake, et le serveur présente le bon certificat.
OpenSSL est composé de plusieurs bibliothèques :
libssl : Implémentation de TLS/SSL
- Gestion des connexions TLS
- Handshake protocol
- Sessions et cache
libcrypto : Algorithmes cryptographiques
- Chiffrement (AES, DES, etc.)
- Hachage (SHA, MD5, etc.)
- Clés publiques (RSA, EC, etc.)
OpenSSL fournit aussi un outil en ligne de commande très puissant :
# Générer une clé privée
openssl genrsa -out private.key 2048
# Générer un certificat auto-signé
openssl req -new -x509 -key private.key -out certificate.crt -days 365
# Tester une connexion TLS
openssl s_client -connect www.google.com:443
# Afficher les informations d'un certificat
openssl x509 -in certificate.crt -text -noout
# Convertir un certificat PEM en DER
openssl x509 -in cert.pem -outform DER -out cert.derPlusieurs options existent pour utiliser OpenSSL avec FreePascal :
1. Synapse
- Bibliothèque réseau complète
- Bindings OpenSSL intégrés
- Simple d'utilisation
- Recommandé pour débuter
2. Indy (Internet Direct)
- Suite de composants réseau
- Support SSL via OpenSSL
- Nombreux protocoles
3. Bindings OpenSSL natifs
- Plus bas niveau
- Contrôle total
- Nécessite plus de code
4. mORMot
- Framework complet
- Bindings OpenSSL optimisés
- Excellentes performances
uses
httpsend, ssl_openssl;
function GetHTTPS(const URL: string): string;
var
HTTP: THTTPSend;
begin
HTTP := THTTPSend.Create;
try
if HTTP.HTTPMethod('GET', URL) then
Result := HTTP.Document.DataString
else
Result := 'Erreur: ' + IntToStr(HTTP.ResultCode);
finally
HTTP.Free;
end;
end;Synapse charge automatiquement les bibliothèques OpenSSL et gère le TLS.
Sur Windows et Linux, OpenSSL est constitué de fichiers de bibliothèque :
Windows :
libssl-3.dll(oussleay32.dllpour les anciennes versions)libcrypto-3.dll(oulibeay32.dll)
Linux :
libssl.so.3(oulibssl.so.1.1)libcrypto.so.3(oulibcrypto.so.1.1)
Les bindings FreePascal chargent dynamiquement ces bibliothèques au démarrage.
Un certificat est généralement signé par une CA intermédiaire, elle-même signée par une CA racine :
Certificat racine (CA racine - auto-signé)
↓ signe
Certificat intermédiaire (CA intermédiaire)
↓ signe
Certificat du serveur (www.exemple.com)
Le client doit vérifier toute la chaîne jusqu'à une CA racine de confiance.
- Validité temporelle : Le certificat est-il dans sa période de validité ?
- Chaîne de confiance : La signature remonte-t-elle à une CA de confiance ?
- Révocation : Le certificat a-t-il été révoqué ? (CRL ou OCSP)
- Nom de domaine : Le nom dans le certificat correspond-il au serveur ?
- Usage : Le certificat est-il autorisé pour TLS serveur ?
Pour une sécurité accrue, vous pouvez "épingler" un certificat :
// Concept : vérifier que le certificat reçu correspond exactement
// à celui attendu (ou sa clé publique)
const
EXPECTED_CERT_HASH = 'A1B2C3D4...'; // Hash SHA-256 du certificat
function VerifyCertificate(const ReceivedCertHash: string): Boolean;
begin
Result := (ReceivedCertHash = EXPECTED_CERT_HASH);
end;Avantages :
- Protection contre les CA compromises
- Protection contre les attaques MITM avec faux certificats
Inconvénients :
- Moins flexible (renouvellement de certificat compliqué)
- Nécessite une mise à jour de l'application
// Concept : configurer pour n'accepter que TLS 1.2+
SSL.MinVersion := TLS1_2_VERSION;
SSL.MaxVersion := TLS1_3_VERSION;À désactiver :
- SSL 2.0 ❌
- SSL 3.0 ❌ (vulnérable à POODLE)
- TLS 1.0 ❌ (vulnérable à BEAST)
- TLS 1.1 ❌
À utiliser :
- TLS 1.2 ✅
- TLS 1.3 ✅ (recommandé)
// Concept : définir les cipher suites acceptables
const
SECURE_CIPHERS =
'ECDHE-RSA-AES256-GCM-SHA384:' +
'ECDHE-RSA-AES128-GCM-SHA256:' +
'ECDHE-RSA-CHACHA20-POLY1305';À éviter :
- Cipher suites avec DES ou 3DES ❌
- Cipher suites sans PFS (RSA key exchange) ❌
- Cipher suites avec MD5 ou SHA1 ❌
- Cipher suites EXPORT ❌
// Toujours activer la validation des certificats
SSL.VerifyMode := SSL_VERIFY_PEER;
SSL.VerifyDepth := 9; // Profondeur de la chaîne
// Ne JAMAIS ignorer les erreurs de certificat en production !
// Sauf pour les tests en développement
{$IFDEF DEBUG}
SSL.VerifyMode := SSL_VERIFY_NONE; // UNIQUEMENT EN DEV !
{$ENDIF}Pour les tests en développement :
# Générer une clé privée
openssl genrsa -out server.key 2048
# Générer un certificat auto-signé valide 365 jours
openssl req -new -x509 -key server.key -out server.crt -days 365 \
-subj "/C=FR/ST=Normandie/L=Rouen/O=MaCompagnie/CN=localhost"Attention : Les certificats auto-signés ne sont jamais acceptables en production !
Let's Encrypt fournit des certificats gratuits et automatisables :
# Installation de certbot (Ubuntu)
sudo apt install certbot
# Obtenir un certificat
sudo certbot certonly --standalone -d www.exemple.comLes certificats sont placés dans /etc/letsencrypt/live/www.exemple.com/
Évite de refaire le handshake complet pour les reconnexions :
Session IDs :
- Le serveur assigne un ID de session
- Le client peut réutiliser cette session
Session Tickets (TLS 1.2+) :
- Le serveur chiffre l'état de la session
- Le client stocke le ticket
- Pas besoin de cache côté serveur
Au lieu que le client vérifie la révocation auprès de la CA :
- Le serveur obtient la réponse OCSP
- Le serveur "agrafe" (staple) cette réponse au certificat
- Réduit la latence et protège la vie privée
OpenSSL peut utiliser les instructions CPU dédiées :
- AES-NI : Instructions Intel/AMD pour AES
- AVX : Calculs vectoriels
- Peut multiplier les performances par 5-10x
1. OpenSSL s_client
# Tester une connexion et voir les détails
openssl s_client -connect www.google.com:443 -showcerts
# Tester avec un protocole spécifique
openssl s_client -connect www.example.com:443 -tls1_2
# Tester avec SNI
openssl s_client -connect 192.168.1.1:443 -servername www.example.com2. Wireshark
- Capture et analyse du trafic réseau
- Peut déchiffrer TLS si vous avez la clé privée
- Visualise le handshake TLS
3. SSL Labs (en ligne)
- https://www.ssllabs.com/ssltest/
- Teste la configuration SSL/TLS d'un serveur
- Note de A+ à F
| Erreur | Signification | Solution |
|---|---|---|
certificate verify failed |
Certificat invalide ou non fiable | Vérifier la chaîne de certification |
unknown ca |
CA non reconnue | Ajouter la CA au trust store |
certificate has expired |
Certificat expiré | Renouveler le certificat |
handshake failure |
Incompatibilité de configuration | Vérifier les cipher suites |
ssl3_get_record:wrong version number |
Problème de version SSL/TLS | Vérifier les versions supportées |
Pour créer une application portable, créez une couche d'abstraction :
type
TSSLConfig = record
MinVersion: Integer;
MaxVersion: Integer;
CipherList: string;
CertFile: string;
KeyFile: string;
CAPath: string;
end;
function InitSSL(const Config: TSSLConfig): Boolean;
begin
{$IFDEF WINDOWS}
Result := InitSSL_Windows(Config);
{$ENDIF}
{$IFDEF UNIX}
Result := InitSSL_Unix(Config);
{$ENDIF}
end;Les emplacements varient selon l'OS :
Windows :
- Certificats : Souvent avec l'application ou dans
%PROGRAMDATA% - Pas de store système par défaut pour OpenSSL
- OpenSSL DLLs : À côté de l'exécutable ou dans
System32
Ubuntu/Linux :
- Certificats CA :
/etc/ssl/certs/ - Certificats serveur :
/etc/ssl/ou/etc/letsencrypt/ - Bibliothèques :
/usr/lib/x86_64-linux-gnu/ou/usr/lib/
- OpenSSL Documentation : https://www.openssl.org/docs/
- OpenSSL Wiki : https://wiki.openssl.org/
- RFCs TLS :
- TLS 1.2 : RFC 5246
- TLS 1.3 : RFC 8446
- Bulletproof SSL and TLS par Ivan Ristić
- Network Security with OpenSSL par Viega, Messier, Chandra
- OpenSSL Cookbook par Ivan Ristić (gratuit en ligne)
- OpenSSL Users Mailing List
- Stack Overflow (tag: openssl)
- Forums FreePascal/Lazarus
TLS/SSL avec OpenSSL est la pierre angulaire de la sécurité des communications réseau. Que vous développiez un client HTTP, un serveur API, ou toute application communiquant sur le réseau, une compréhension solide de TLS/SSL est indispensable.
OpenSSL offre une implémentation robuste, performante et multi-plateforme de ces protocoles. Avec FreePascal et Lazarus, vous avez accès à plusieurs bibliothèques qui facilitent l'intégration d'OpenSSL dans vos applications.
Points clés à retenir :
- TLS 1.2+ uniquement, jamais SSL 3.0 ou inférieur
- Toujours valider les certificats en production
- Utiliser des cipher suites modernes avec PFS
- Comprendre la chaîne de certification
- Tester régulièrement votre configuration SSL/TLS
- Garder OpenSSL à jour pour les correctifs de sécurité
Dans les sections suivantes, nous verrons comment configurer OpenSSL sur Windows et Ubuntu, puis comment l'utiliser concrètement dans vos applications FreePascal.
Prochaines sections :
- 17.2.1 Configuration OpenSSL Windows
- 17.2.2 Configuration OpenSSL Ubuntu