web-dev-qa-db-fra.com

Le contrôle de l'empreinte digitale d'un certificat auto-signé améliore-t-il la sécurité?

Je développe actuellement une composante pour une application qui correspond TCP communication avec un périphérique dans un réseau local. J'utilise TLS pour fournir un cryptage, une intégration et une autorisation de données. Cependant, je dois utiliser soi-même certificats signés qui n'expireront pas dans 5 ans ou plus.

Étant donné que l'utilisation de certificats auto-signés expose ma candidature aux attaques inter-attaques, je pensais à la codage de l'empreinte digitale du certificat dans ma demande. Lorsque l'appareil envoie mon certificat, je vais comparer son empreinte digitale du certificat avec l'empreinte digitale codée.

Maintenant, cela améliore-t-il la sécurité de ma candidature? Est-il possible pour un attaquant de produire son propre certificat auto-signé qui a la même empreinte digitale? Je prévois également d'utiliser un certificat client que je vais envoyer à l'appareil pendant la poignée de main TLS. L'appareil que doit vérifier l'empreinte digitale de mon certificat.

Cette solution est-elle valide?

Merci d'avance pour vos réponses!

7
WMEZ

Dans SSL/TLS , le client utilise la clé publique du serveur. Depuis En général Le client ne connaît pas la clé publique du serveur à avancé, il s'attend à l'obtenir via la magie de l'infrastructure de clé Infrastructure de clé publique : la clé publique du serveur sera être présenté dans A Certificat et le client pourra vérifier que:

  • le contenu du certificat est authentique (c'est validation: Les signatures et les noms de noms et de certificats sont corrects et relient à une racine de confiance);
  • le certificat appartient au serveur prévu (le nom du serveur attendu apparaît dans l'Subject Alt Name Extension du certificat, ou son nom commun s'il n'y a pas SAN Extension).

Maintenant, tout cela est une complication inutile si le client connaît déjà la clé publique; Si cette clé est connue A priori, le client peut simplement l'utiliser et simplement ignorer le certificat envoyé par le serveur.

Pour des raisons de compatibilité avec la spécification formelle du protocole, et de réutiliser plus facilement les bibliothèques et la mise en œuvre existantes, il est probablement encore plus simple de faire ce que vous suggérez, c'est-à-dire que vous vérifiez que le certificat du serveur est bit-to-bit le certificat attendu, et laissez le code extraire la clé publique de cela. "Empreinte digitale", s'il est calculé avec une fonction de hachage résistant aux seconde préimages (par exemple SHA-1), peut être utilisé pour cette vérification. C'est bon.


Dans votre cas, je comprends que le serveur est le périphérique et le client est votre application. Votre application ne sera pas dupe (parle à un faux appareil) uniquement tant que l'attaquant n'a pas compromis la clé privée de l'appareil, c'est-à-dire extraite à partir d'un périphérique. Si vous avez plusieurs Périphériques, chaque appareil doit avoir sa propre paire de clés privée/publique. Si tous les périphériques ont la même paire de clés, la clé privée ne peut pas être considérée comme "privée": un secret connu de plus de deux ou trois personnes n'est pas un secret, mais une rumeur.

La méthode "sûre" est alors d'avoir une sorte de phase d'initialisation, dans des conditions contrôlées, où l'instance d'application apprend les empreintes digitales des périphériques à laquelle il se connectera ensuite (peut-être l'application génère la paires de clés publiques/privées et certificats auto-signés et les importe dans les appareils).

Ceci est le modèle de sécurité utilisé dans [~ # ~] ssh [~ # ~ ~] : La première connexion d'un client à un serveur donné nécessite une confirmation explicite (le client affiche l'empreinte de clé publique du serveur, et l'utilisateur humain est censé vérifier, par exemple, téléphonant au serveur Sysadmin); Ensuite, le client fait confiance à cette clé publique car elle se souvient l'empreinte digitale.


Le modèle "N'oubliez pas que le modèle de la clé" fonctionne bien, mais il faut savoir qu'il incitent la fonctionnalité PKI connue sous le nom de révocation : un groupe hors bande, Mécanisme automatique pour transmettre des informations de confinement de dommages. Si la clé privée de l'un des périphériques est compromise, le voleur peut ensuite exécuter un faux dispositif et tromper votre application en vous connectant; Pour éviter cette situation de persister, l'application doit être avertie d'une manière ou d'une autre qu'une empreinte de certificat donnée ne doit plus être acceptée. Les contrôles de révocation, avec des réponses CRL ou OCSP publiées régulièrement, sont une méthode automatique pour le faire. Lorsque vous vous êtes souvenu des empreintes digitales, il n'y a pas de PKI, donc pas de CRL. Mais le besoin peut être toujours là.

Si vous suivez la route NO-PKI, avec des empreintes digitales de certificat intégrées, vous devez décider si vous avez besoin de quelque chose pour assurer le travail normalement effectué par la CRL.

8
Thomas Pornin

Ce que vous faites ici semble un peu similaire à Certificat pinning . Dans certaines situations, cela peut réellement fournir une meilleure sécurité que d'utiliser un certificat de CA émis (en ce que vous n'avez pas à faire confiance à l'AR)

L'inconvénient est que cela rend la gestion de certificats (par exemple la révocation, la réadaptation) un processus manuel qui peut être un problème réel, en fonction de votre cas d'utilisation.

4
Rory McCune

Oui, cela est effectivement le même que de faire confiance à votre certificat racine utilisé pour signer le certificat. Le processus de vérification d'un certificat est de prendre l'empreinte de tige et de vérifier que la signature que vous avez à partir d'une autorité de certification approuvée correspond à l'empreinte Thumb. Vérification de l'empreinte Thumb est une action équivalente.

2
AJ Henderson