web-dev-qa-db-fra.com

OpenSSL et s_client - pourquoi une clé privée est-elle requise du client?

J'ai besoin de configurer un canal de communication SSL bidirectionnel entre une application .NET/WCF et un serveur Web tiers. En ce moment, j'essaie d'obtenir une prise de contact réussie avec l'hôte afin de valider que tous les éléments sont correctement configurés (certificat client, autorité de certification serveur, communication réseau ...). J'utilise l'outil de ligne de commande openSSL pour essayer de valider cela, en utilisant la commande s_client.

Voici ce qui m'arrête et ce que je ne comprends pas:

  • quoi que je fasse, openSSL s'attend à trouver une clé privée pour le certificat client
  • le certificat client m'a été remis par le tiers, mais il ne contient aucune clé privée
  • si je viens de générer mon propre fichier de clé privée en utilisant openSSL, je reçois une erreur de non-concordance des valeurs de clé

Gardez à l'esprit que je viens de commencer à mettre la main sur SSL, j'ai donc une compréhension très basique de l'ensemble du protocole. D'après ce que j'ai lu, il semble que le serveur et le client ont besoin de leur clé privée dans un paramètre SSL à 2 voies. Cependant, je ne peux pas comprendre comment obtenir une clé privée de travail sur mon client (en utilisant le certificat client qui m'a été donné). J'apprécierais beaucoup que quelqu'un puisse faire la lumière sur les clés privées du certificat client, car cela me donne un mal de tête majeur.

Merci!

28
Aerendel

Les certificats seuls ne sont que des informations publiques. Ce qui relie un certificat de clé publique au nom qu'il contient est le fait que quiconque a un contrôle légitime sur ce nom (par exemple votre nom ou le nom de votre serveur) possède également la clé privée pour celui-ci.

Les certificats sont utilisés pour prouver l'identité de la partie distante en demandant à la partie distante d'effectuer une opération qui ne peut être effectuée qu'avec la clé privée correspondante: signer quelque chose (qui peut être vérifié avec la clé publique) ou déchiffrer quelque chose qui a été chiffré avec la clé publique. (Les deux peuvent se produire dans la négociation SSL/TLS, selon la suite de chiffrement.)

Pendant la prise de contact SSL/TLS, le serveur envoie son certificat (en clair) et prouve au client qu'il possède la clé privée correspondante en utilisant un échange de clé authentifié .

Dans votre cas, vous souhaitez également utiliser l'authentification par certificat client. Il ne suffit pas d'envoyer le certificat client lors de la prise de contact: le client doit également prouver qu'il possède la clé privée. Sinon, toute personne qui reçoit ce certificat pourrait le cloner. Le but de l'utilisation de certificats est d'empêcher tout clonage, de manière à ce que vous n'ayez jamais à montrer votre propre secret (la clé privée).

Plus précisément, le client doit signer les messages de négociation dans le message Certificate Verify de la négociation TLS afin que le serveur puisse le vérifier par rapport à la clé publique envoyée dans le certificat client. Sans cette étape, aucune authentification par certificat client n'aurait lieu.

le certificat client m'a été remis par le tiers, mais il ne contient aucune clé privée

Vous donner votre certificat sans sa clé privée semble un peu inutile, à moins que l'on ne s'attende à ce que vous ayez généré une demande de certificat de votre côté (auquel cas vous auriez la clé privée).

En effet, plutôt que de recevoir un certificat et sa clé privée, il est préférable de générer votre paire de clés, de créer une demande de certificat (CSR) et de demander à votre autorité de certification d'émettre un certificat à partir de cette CSR (mais sans qu'elle sache jamais votre Clé privée). Dans ce cas, vous auriez dû conserver votre clé privée et vous pourrez l'utiliser avec le certificat que vous auriez reçu.

50
Bruno