Déploiement de l'épinglage de clé publique avec les rapports HPKP

Emily Stark

L'utilisation de la technologie SSL sur votre site est un moyen important de préserver la sécurité et la confidentialité de vos utilisateurs. Cependant, l'activation de SSL n'est pas la fin de l'histoire: vous pouvez prendre de nombreuses mesures pour renforcer encore plus la sécurité de votre site, que ce soit en définissant l'attribut Secure dans vos cookies, en activant HTTP Strict Transport Security ou en utilisant Content Security Policy pour verrouiller les droits de votre site. Il peut toutefois s'avérer difficile de déployer ces puissantes fonctionnalités. Pour vous aider à déployer une forme de SSL plus stricte, Chrome 46 propose une fonctionnalité appelée "Création de rapports HPKP".

Que signifient tous ces acronymes ?

Aujourd'hui, la sécurité sur le Web repose sur des certificats SSL: des signatures cryptographiques qui prouvent qu'un site Web est bien tel qu'il est. Lorsque votre navigateur envoie une requête à une URL telle que https://developers.google.com, le serveur fournit un certificat SSL. Si celui-ci est valide, le navigateur autorise la requête à poursuivre et affiche l'URL du site Web avec un cadenas vert dans la barre d'adresse.

Mais qu’est-ce qu’un certificat valide ? Pour être considéré comme valide, un certificat doit être signé par une autorité de certification, ou par un autre certificat signé par une autorité de certification (connue sous le nom d'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 autorisées à émettre des certificats. Cependant, le problème est que, par défaut, chacune 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 se comporte pas correctement, cela peut être dévastateur pour l'ensemble du Web.

Saisissez HTTP Public Key Pinning (HPKP). Cette norme permet aux sites Web d'envoyer un en-tête HTTP demandant au navigateur de mémoriser (ou "épingler") des parties de sa chaîne de certificats SSL. Le navigateur refuse alors les connexions suivantes qui ne correspondent pas aux codes qu'il a reçus précédemment. 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 certificat en tant que codes d'accès. L'une est le hachage d'un certificat dans la chaîne de certificats du site. L'autre est un code secret de secours, c'est-à-dire le hachage d'un certificat, que le site peut utiliser s'il doit effectuer une rotation de son certificat. L'en-tête inclut également une valeur max-age. Une fois ce délai écoulé, le navigateur oublie le repère.

Pour en savoir plus sur le HPKP en général, consultez les spécifications ou l'excellent article de blog publié par Chris Palmer, un autre développeur Chrome.

Dois-je activer HPKP tout de suite ?

Pas forcément. Lorsque vous déployez HPKP, il est assez facile de commettre une erreur et d'attaquer accidentellement votre site par DoS. Si vous épinglez votre site à un ensemble de certificats, puis devez en déployer un nouveau, les utilisateurs qui ont vu le code ne pourront pas accéder à votre site jusqu'à ce qu'il expire (en fonction de la valeur max-age dans l'en-tête).

Comme il est difficile d'y arriver, HPKP est actuellement principalement utilisé par quelques sites importants et sensibles à la sécurité. Si vous décidez d'activer le HPKP, vous devez commencer par une valeur "max-age" très courte et l'augmenter progressivement si vous ne rencontrez pas de problème.

Qu'est-ce que la création de rapports HPKP et en quoi est-ce utile ?

La fonctionnalité de création de rapports HPKP, disponible dans Chrome 46, vous permet de détecter les erreurs de configuration lorsque vous déployez HPKP.

Tout d'abord, vous pouvez commencer par 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. Dans le cas contraire, un rapport est envoyé à report-uri. Chrome ne bloquera jamais les requêtes basées sur les épingles d'un en-tête "Rapport uniquement". Il s'agit donc d'un moyen sûr d'essayer HPKP et de vérifier si cela pose problème à vos utilisateurs, sans risquer d'attaquer votre site par DoS.

Notez qu'un en-tête "Rapport uniquement" ne s'applique qu'à la requête pour laquelle il est reçu. Le navigateur ne se souvient pas des repères "Rapport uniquement", comme c'est le cas pour les vrais repères. Cela vous permet de tester votre configuration sans craindre de mettre en cache des valeurs incorrectes dans les navigateurs de vos utilisateurs, et de les déployer progressivement (par exemple, uniquement sur une seule ressource) pour éviter d'inonder votre serveur de rapports.

Lorsque vous déployez le véritable en-tête Public-Key-Pins pour commencer à appliquer vos épingles, vous pouvez également inclure une valeur d'URI de rapport dans cet en-tête. Vous continuerez ainsi à recevoir des rapports en cas de problème.

Que contient un rapport de violation HPKP ?

Un rapport de cas de non-conformité HPKP est un message JSON envoyé dans une requête HTTP POST à votre report-uri configuré. La liste des champs est disponible dans la spec, mais je vais en souligner deux ici: served-certificate-chain et validated-certificate-chain. served-certificate-chain est le certificat exactement tel que Chrome l'a reçu lors de la configuration de la connexion SSL pour la requête. Le validated-certificate-chain, en revanche, est la chaîne que Chrome a recréée lors de la tentative de validation du certificat du serveur, qui, surprenant, peut être différent de served-certificate-chain. Différents clients effectuent la validation des certificats de différentes manières, ce qui peut être une cause fréquente des erreurs de configuration du HPKP. Assurez-vous de vérifier ce champ si vous recevez des rapports inattendus.

Un dernier coup de cœur

Si vous déployez les rapports HPKP, n'oubliez pas que Chrome épingle la validation pour toutes les requêtes, y compris celles qui envoient des rapports. Par conséquent, si vous avez déployé HPKP pour votre site, vous souhaiterez probablement envoyer des rapports HPKP à un autre domaine que vous n'avez pas épinglé. Dans le cas contraire, tout non-respect des règles sur votre site déclenchera un signalement pour le même domaine, ce qui entraînera l'échec du non-respect des règles, et vous ne recevrez donc pas le rapport.

Si vous n'avez pas d'autre domaine sous la main, vous pouvez essayer un service tel que report-uri.io, qui gère les signalements d'infractions à votre place.