170 votes

CryptographicException 'Keyset does not exist', mais uniquement via WCF

J'ai un code qui fait un appel à un service web tiers qui est sécurisé par une certification X.509.

Si j'appelle le code directement (en utilisant un test unitaire), il fonctionne sans aucun problème.

Une fois déployé, ce code sera appelé via un service WCF. J'ai ajouté un second test unitaire qui appelle le service WCF, mais il échoue avec un message d'erreur de type CryptographicException message "Keyset does not exist" lorsque j'appelle une méthode sur le service web tiers.

Je présume que c'est parce que mon service WCF essaiera d'appeler le service Web tiers en utilisant un utilisateur différent du mien.

Quelqu'un peut-il apporter un éclairage supplémentaire sur cette question ?

294voto

Steve Sheldon Points 2398

Ceci est probablement dû au fait que l'utilisateur IIS n'a pas accès à la clé privée de votre certificat. Vous pouvez régler cela en suivant les étapes suivantes...

  1. Démarrer Exécuter MMC
  2. Fichier Ajouter/Supprimer un Snapin
  3. Ajouter le Snap In des certificats
  4. Sélectionnez Compte d'ordinateur, puis cliquez sur suivant
  5. Sélectionnez Ordinateur local (par défaut), puis cliquez sur Terminer.
  6. Dans le panneau de gauche de la Console Root, naviguez jusqu'à Certificats (Ordinateur local) Certificats personnels
  7. Votre certificat se trouve très probablement ici.
  8. Cliquez avec le bouton droit de la souris sur votre certificat Toutes les tâches Gérer les clés privées
  9. Définissez les paramètres de votre clé privée ici.

1 votes

Il convient de noter que ce n'est pas une option sur Server 2003, à moins que mon environnement ne soit configuré de manière farfelue. En revanche, je peux le faire sous Windows 7.

0 votes

Que voulez-vous dire par "définir la clé privée ici" ? Je veux dire que vous pouvez seulement ajouter l'utilisateur avec l'accès droit !?

11 votes

Merci, je voulais juste signaler que si vous utilisez iis7.5 et que le pool d'applications fonctionne sous le nom d'applicationpoolidentity, vous devrez donner à IIS AppPool \DefaultAppPool les autorisations de l'utilisateur pour le fichier. Cela a réglé le problème pour moi.

176voto

blowdart Points 28735

Il s'agit probablement d'un problème de permissions sur le certificat.

Lors de l'exécution d'un test unitaire, vous allez l'exécuter dans votre propre contexte utilisateur, qui (en fonction du magasin dans lequel se trouve le test unitaire) est le contexte de l'utilisateur. client se trouve) aura accès à la clé privée de ce certificat.

Cependant, si votre service WCF est hébergé sous IIS, ou en tant que service Windows, il est probable qu'il soit exécuté sous un compte de service (service réseau, service local ou tout autre compte restreint).

Vous devrez définir les autorisations appropriées sur la clé privée pour permettre à ce compte de service d'y accéder. MSDN a les détails

0 votes

L'exécution des calculs m'a aidé pour un problème complètement différent, merci.

3 votes

J'exécute mon APP en tant qu'administrateur et le problème a disparu.

1 votes

+1 pour le Documentation MSDN et les étapes énumérées s'appliquent même à une application Web.

39voto

Željko Tanović Points 452

J'ai eu le même problème la nuit dernière. Les permissions sur la clé privée étaient correctement définies, tout allait apparemment bien sauf l'erreur "Keyset doesn't exist". Finalement, il s'est avéré que le certificat a d'abord été importé dans le magasin de l'utilisateur actuel, puis déplacé vers le magasin de la machine locale. Cependant - cela n'a pas déplacé la clé privée, qui était toujours dans le magasin de l'utilisateur actuel.

C:\Documents et de l'établissement \Administrator...

au lieu de

C:\Documents et de l'établissement \All les utilisateurs...

Bien que les permissions sur la clé soient correctement définies, ASPNET ne pouvait pas y accéder. Lorsque nous avons réimporté le certificat de sorte que la clé privée soit placée dans la branche All users, le problème a disparu.

1 votes

Même problème. Microsoft doit arrêter de laisser les bozos de la sécurité diriger l'asile.

2 votes

Après 3 heures perdues, ceci résout mon problème - Merci. J'ai utilisé le FindPrivateKey et je ne comprenais pas pourquoi il semblait se trouver dans le keystore de mon utilisateur, même s'il apparaissait dans LocalMachine via le snap-in MMC.

0 votes

Je te paierais une bière pour les heures perdues à jouer avec les permissions comme toutes les autres réponses me l'ont demandé.

19voto

desegel Points 83

J'ai eu le même problème en essayant d'exécuter une application WCF à partir de Visual Studio. Je l'ai résolu en exécutant Visual Studio en tant qu'administrateur.

11voto

Vaibhav.Inspired Points 161

J'ai été confronté à ce problème, mes certificats avaient une clé privée mais j'ai obtenu cette erreur( "Le jeu de clés n'existe pas" )

Cause : Votre site web est exécuté sous le compte "Services réseau" ou avec moins de privilèges.

Solution : Changez l'identité du pool d'applications en "Système local", réinitialisez IIS et vérifiez à nouveau. S'il commence à fonctionner, c'est un problème de permission/moins de privilèges, vous pouvez vous faire passer pour un autre compte.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X