L'utilisation du protocole SSL sur votre site est un moyen important de préserver la sécurité et la confidentialité de vos utilisateurs. Mais l'activation du protocole SSL ne suffit pas. Vous pouvez prendre de nombreuses mesures pour renforcer la sécurité de votre site, par exemple en définissant l'attribut Secure sur vos cookies, en activant HTTP Strict Transport Security ou en utilisant la politique de sécurité du contenu pour verrouiller les droits d'accès de votre site. Le déploiement de ces fonctionnalités puissantes peut toutefois parfois s'avérer délicat. Pour vous aider à déployer une forme plus stricte de SSL, Chrome 46 est fourni avec une fonctionnalité appelée "Signalements HPKP".
Que signifient tous ces acronymes ?
La sécurité sur le Web repose aujourd'hui sur les certificats SSL: signatures cryptographiques prouvant qu'un site Web est bien celui qu'il prétend être. Lorsque votre navigateur envoie une requête à une URL telle que https://developers.google.com, le serveur fournit un certificat SSL. Si le certificat est valide, le navigateur autorise la requête à être traitée et affiche l'URL du site Web avec un cadenas vert dans la barre d'adresse.
Qu'est-ce qu'un certificat valide ? Pour être considéré comme valide, un certificat doit être signé par une autorité de certification (AC) ou par un autre certificat signé par une AC (appelée autorité de certification intermédiaire). Les navigateurs et les systèmes d'exploitation sont fournis avec une liste de plusieurs centaines d'autorités de certification approuvées pour émettre des certificats. Le problème est que, par défaut, n'importe laquelle de ces autorités de certification peut émettre des certificats pour n'importe quel site Web. Si l'un d'eux est compromis ou ne fonctionne pas correctement, cela peut avoir des conséquences dévastatrices pour l'ensemble du Web.
Saisissez "HTTP Public Key Pinning" (Épinglage de clé publique HTTP) ou HPKP. Cette norme permet aux sites Web d'envoyer un en-tête HTTP indiquant au navigateur de mémoriser (ou d'épingler) des parties de sa chaîne de certificats SSL. Le navigateur refusera ensuite les connexions ultérieures qui ne correspondent pas aux épingles qu'il a précédemment reçues. Voici un exemple d'en-tête HPKP:
Public-Key-Pins:
pin-sha256="d6qzRu9zOECb90Uez27xWltNsj0e1Md7GkYYkVoZWmM=";
pin-sha256="LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=";
max-age=259200
Cet en-tête spécifie deux hachages de certificats en tant que goupilles. L'un est un hachage d'un certificat dans la chaîne de certificats du site, et l'autre est un code de secours ou un hachage d'un certificat que le site peut utiliser au cas où il aurait besoin de faire pivoter son certificat. L'en-tête inclut également une valeur max-age
. Une fois ce nombre de secondes écoulé, le navigateur oubliera l'épingle.
Pour en savoir plus sur le HPKP en général, consultez la spécification ou l'excellent article de blog de Chris Palmer, développeur Chrome.
Dois-je activer le HPKP maintenant ?
Pas forcément. Lorsque vous déployez HPKP, il est assez facile de faire une erreur et de lancer accidentellement une attaque DoS sur votre site. Si vous épinglez votre site à un ensemble de certificats, puis que vous devez en déployer un autre, les utilisateurs qui ont vu l'épingle ne pourront pas accéder à votre site tant qu'elle n'aura pas expiré (selon la valeur max-age
dans l'en-tête).
Comme il est difficile de bien le configurer, le HPKP est actuellement utilisé principalement par quelques sites de grande envergure sensibles à la sécurité. Si vous décidez d'activer le HPKP, vous devez commencer par une valeur d'expiration maximale très courte et l'augmenter progressivement si vous ne rencontrez aucun problème.
En quoi consistent les rapports HPKP et à quoi servent-ils ?
Les rapports HPKP, disponibles dans Chrome 46, sont une fonctionnalité que vous pouvez utiliser pour détecter les erreurs de configuration lorsque vous déployez HPKP.
Vous pouvez d'abord envoyer l'en-tête Public-Key-Pins-Report-Only
au lieu de l'en-tête Public-Key-Pins:
Public-Key-Pins-Report-Only:
max-age=2592000;
pin-sha256="E9CZ9INDbd+2eRQozYqqbQ2yXLVKB9+xcprMF+44U1g=";
pin-sha256="LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=";
report-uri="https://example.net/pkp-report"
Lorsque votre site envoie un tel en-tête, Chrome vérifie si la connexion actuelle correspond aux épingles et envoie un rapport à report-uri
si ce n'est pas le cas. Chrome ne bloquera jamais les requêtes en fonction des épingles d'un en-tête "Report-Only". Il s'agit donc d'un moyen sûr d'essayer HPKP et de voir s'il pose problème à vos utilisateurs sans courir le risque d'un DoS sur votre site.
Notez qu'un en-tête "Report-Only" ne s'applique qu'à la requête sur laquelle il est reçu. Le navigateur ne se souvient pas des épingles "Rapport uniquement" comme il le fait pour les épingles réelles. Cela vous permet de tester votre configuration sans vous soucier de la mise en cache de mauvaises valeurs dans les navigateurs de vos utilisateurs. Vous pouvez également déployer de manière incrémentielle (par exemple, sur une seule ressource) pour éviter d'inonder votre serveur de rapports.
Lorsque vous déployez l'en-tête Public-Key-Pins
réel pour commencer à appliquer vos épingles, vous pouvez également inclure une valeur report-uri dans cet en-tête afin de continuer à recevoir des rapports en cas de problème.
Que contient un rapport de non-respect de la directive HPKP ?
Un rapport de non-respect de la HPKP est un message JSON envoyé dans une requête HTTP POST à votre report-uri
configuré. La liste des champs se trouve dans la spécification, mais je vais en mettre en avant deux: served-certificate-chain
et validated-certificate-chain
. served-certificate-chain
correspond au certificat tel que Chrome l'a reçu lors de la configuration de la connexion SSL pour la requête. validated-certificate-chain
, en revanche, est la chaîne que Chrome a reconstruite lors de la tentative de validation du certificat du serveur, qui peut, étonnamment, être différente de served-certificate-chain
. Les différents clients effectuent la validation des certificats de différentes manières, ce qui peut être une cause courante de mauvaise configuration de HPKP. Veillez à cocher ce champ si vous recevez des rapports inattendus.
Un dernier point
Si vous déployez des rapports HPKP, n'oubliez pas que Chrome valide les épingles pour toutes les requêtes, y compris les requêtes d'envoi de rapports. Par conséquent, si vous avez déployé HPKP pour votre site, vous souhaitez probablement envoyer des rapports HPKP à un autre domaine que vous n'avez pas épinglé. Sinon, un cas de non-respect des règles concernant les épingles sur votre site déclenchera un rapport sur le même domaine, ce qui entraînera également un échec du cas de non-respect des règles concernant les épingles, et vous ne recevrez donc pas le rapport.
Si vous ne disposez pas d'un autre domaine, vous pouvez essayer un service tel que report-uri.io, qui gère les signalements de non-respect pour vous.