Certificate Pinning est un mécanisme de fixation du certificat ou de la clé publique du serveur, par lequel l’application utilise une empreinte connue à l’avance pour vérifier la connexion HTTPS. Contrairement à la chaîne de confiance standard via une CA, le pinning garantit que même une autorité de certification compromise ne peut pas émettre un certificat frauduleux pour votre domaine. Selon OWASP MSTG (2025), le Certificate Pinning fait partie de la liste des contrôles obligatoires pour les applications de niveau de protection L2. L’implémentation comprend le stockage des hachages de certificats dans le code et leur vérification à chaque requête.
Points clés
Certificate Pinning est une technique de sécurité par laquelle une application stocke l’empreinte d’un certificat de confiance et l’utilise comme seul critère pour établir une connexion HTTPS. Dans le modèle TLS standard, le client vérifie que le certificat du serveur est signé par une CA racine de confiance — l’une des centaines d’autorités de certification préinstallées sur le système. Le Certificate Pinning remplace cette chaîne par une vérification directe : le certificat doit correspondre à l’échantillon stocké ou contenir la clé publique attendue.
Le problème du modèle standard est devenu évident après les incidents de compromission de CA — DigiNotar (2011), Comodo (2011), TrustCor (2022). Si une CA émet un certificat frauduleux pour votre domaine, le navigateur ou l’application l’accepte comme valide. Certificate Pinning empêche cette attaque : même un certificat frauduleux parfaitement signé sera rejeté car son empreinte ne correspond pas à celle fixée dans l’application.
Le terme pinning vient de pin — « broche » ou « fixateur » : le développeur fixe un certificat de confiance, et tout écart par rapport à celui-ci bloque la connexion. Selon l’étude de Mitre CWE-295, la validation inappropriée des certificats reste l’une des 10 erreurs de sécurité les plus dangereuses dans les applications mobiles, et le Certificate Pinning est une méthode directe pour la prévenir.
À l’origine, le Certificate Pinning était utilisé dans les navigateurs via le mécanisme HPKP (HTTP Public Key Pinning), normalisé dans la RFC 7469. Le développeur envoyait un en-tête HTTP Public-Key-Pins avec les hachages des clés attendues, et le navigateur les stockait pour une période déterminée. Cependant, HPKP s’est avéré dangereux : une seule erreur de configuration pouvait bloquer un site pendant des mois. En 2018, Chrome a cessé de prendre en charge HPKP, et la norme actuelle est devenue l’implémentation côté client — dans une application mobile ou une extension de navigateur.
Le processus de Certificate Pinning comprend trois étapes clés : calcul de l’empreinte, vérification de la connexion et gestion des erreurs. Lors de la préparation, le développeur obtient le hachage SHA-256 du certificat ou de la clé publique du serveur de production. Pour les applications conformes au RGPD et à la norme PCI DSS, il est également nécessaire de fixer les empreintes des CA intermédiaires dans la chaîne.
À chaque requête HTTPS, l’application intercepte le rappel d’authentification TLS, extrait le certificat du serveur et calcule son hachage SHA-256. Ce hachage est comparé à la liste stockée des empreintes de confiance. Si une correspondance est trouvée — la connexion continue. Sinon — l’application doit terminer la connexion et signaler l’erreur sans révéler les détails d’implémentation à l’attaquant.
fun validateCertificate(certificate: X509Certificate,
expectedHash: String): Boolean {
val digest = MessageDigest.getInstance("SHA-256")
val hash = Base64.encodeToString(
digest.digest(certificate.publicKey.getEncoded()),
Base64.DEFAULT
).trim()
return hash == expectedHash
}
La fonction reçoit un objet X509Certificate du serveur et le hachage attendu. Elle extrait d’abord la clé publique du certificat, calcule le hachage SHA-256 et l’encode en Base64. Le résultat est comparé à l’empreinte attendue. En production, il convient d’ajouter la vérification contre un tableau de 2–3 empreintes pour prendre en charge la rotation.
Lors de l’implémentation du pinning, il faut choisir quel objet cryptographique fixer. Le Certificate Pinning se lie au certificat X.509 lui-même — à son numéro de série, sa période de validité et toute la chaîne. Le Public Key Pinning ne fixe que la clé publique à l’intérieur du certificat, ignorant les autres champs. Ce choix a un impact significatif sur les coûts opérationnels.
| Critère | Certificate Pinning | Public Key Pinning |
|---|---|---|
| Objet de fixation | Certificat X.509 complet | Clé publique RSA/ECDSA |
| Rotation | Nécessite une mise à jour à chaque réémission | Ne change pas lors du renouvellement du certificat avec la même clé |
| Sécurité | Liaison de précision maximale | Moins sensible aux détails |
| Flexibilité | Faible — les certificats changent tous les 1–2 ans | Élevée — les clés peuvent durer 5–10 ans |
| Recommandation | Pour les systèmes critiques avec mises à jour contrôlées | Pour la plupart des applications mobiles et APIs |
Public Key Pinning est le choix préféré pour la plupart des projets. Les clés publiques des serveurs restent généralement inchangées lors de la réémission d’un certificat — l’entreprise signe simplement l’ancienne clé avec un nouveau certificat. Cela signifie que l’application ne nécessite pas de mise à jour après un changement de certificat si la paire de clés n’a pas changé. Le Certificate Pinning, en revanche, est recommandé pour les scénarios où le développeur contrôle totalement à la fois le serveur et le code client, comme dans les applications d’entreprise avec un cycle de mise à jour strict.
TOFU est une stratégie dans laquelle le Certificate Pinning n’est pas configuré à l’avance, mais mémorise le certificat lors de la première connexion au serveur. Cette approche est pratique pour les applications qui ne savent pas à l’avance à quel serveur elles vont se connecter. L’inconvénient est la vulnérabilité à une attaque initiale : si la première connexion est interceptée, un certificat frauduleux sera accepté comme de confiance. TOFU est utilisé dans les connexions SSH et certains protocoles P2P.
Sur les deux plateformes, le Certificate Pinning est implémenté en interceptant la connexion TLS au niveau de la pile réseau. Sur iOS, le délégué URLSession ou Alamofire ServerTrustManager est utilisé. Sur Android, la méthode préférée est OkHttp CertificatePinner, qui est intégré dans les clients HTTP populaires et prend en charge la configuration de plusieurs empreintes pour chaque domaine.
func validate(serverTrust: SecTrust,
pinnedHash: String) -> Bool {
guard let certificates = SecTrustCopyCertificateChain(serverTrust)
as? [SecCertificate] else { return false }
for certificate in certificates {
let data = SecCertificateCopyData(certificate)
var hash = Data(repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH))
data.withUnsafeBytes {
CC_SHA256($0.baseAddress,
CC_LONG(data.count), &hash)
}
if hash.base64EncodedString() == pinnedHash {
return true
}
}
return false
}
Dans la fonction Swift, la chaîne de certificats est extraite de serverTrust, un hachage SHA-256 est calculé pour chaque certificat, et le résultat est comparé à celui attendu. L’itération sur tous les certificats de la chaîne permet d’implémenter le pinning au niveau de la CA intermédiaire — si un certificat intermédiaire correspond, la connexion est acceptée. Cela offre une flexibilité lors de la rotation des certificats feuilles.
Si l’application n’utilise pas OkHttp, le Certificate Pinning peut être implémenté via un X509TrustManager personnalisé. Cette méthode nécessite plus de code mais offre un contrôle total sur le processus de vérification. Le TrustManager remplace la méthode checkServerTrusted, où le développeur vérifie manuellement les certificats du serveur et décide de leur confiance. Elle est recommandée uniquement pour les scénarios spécifiques où la bibliothèque OkHttp n’est pas disponible.
L’erreur la plus courante est l’absence de backup pins. Le développeur inclut une seule empreinte de certificat, et lorsqu’elle expire, les utilisateurs perdent massivement la connexion. La configuration minimale acceptable est de deux empreintes : le certificat actuel et une de secours. Idéalement trois : l’actuel, un de secours et l’empreinte de la CA racine comme solution de repli.
La deuxième erreur est le stockage des pins en texte clair dans le code. Un attaquant ayant accès à un APK ou IPA peut facilement extraire et remplacer les empreintes. L’obfuscation des hachages est recommandée : diviser la chaîne en parties, stocker dans des ressources cryptées ou calculer à l’exécution. Pour Android, ProGuard avec obfuscation des constantes de chaînes est efficace.
La troisième erreur est le pinning au niveau du certificat de développement. Les certificats de développement et de production sont généralement différents, mais les développeurs oublient souvent de changer les pins lors de la compilation d’une version release. Le résultat est que l’application de production ne peut pas se connecter au serveur. La solution est des configurations de pins séparées pour le debug et le release via BuildConfig ou des ressources spécifiques aux flavors.
Foire aux questions
SSL Pinning est un terme général pour la liaison à un certificat SSL/TLS. Certificate Pinning est une implémentation spécifique qui fixe le certificat X.509 lui-même, et pas seulement la clé publique. La différence réside dans l’objet de liaison : certificat vs clé.
Il est recommandé de stocker les hachages dans des ressources avec obfuscation via ProGuard (Android) ou cryptés via Keychain (iOS). Évitez de stocker les pins en texte clair dans strings.xml ou Info.plist sans cryptage.
À chaque changement de certificat sur le serveur. Il est recommandé d’ajouter une nouvelle empreinte comme backup pin 3–6 mois avant l’expiration de l’actuelle, et de supprimer l’ancienne après la rotation. Au moins un backup pin est obligatoire.
Oui, par compilation conditionnelle : le pinning est désactivé dans la build de débogage et activé dans la build de release. Utilisez BuildConfig.DEBUG sur Android ou #if DEBUG sur iOS pour basculer. Ne le faites jamais via un indicateur d’exécution accessible à l’utilisateur.
Publiez immédiatement une mise à jour de l’application avec de nouvelles empreintes dans les magasins. Utilisez un mécanisme de mise à jour forcée. Si les backup pins incluaient l’empreinte de la CA de secours, vous pouvez temporairement basculer vers un autre domaine avec un certificat différent.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi