CryptographicException 'Le jeu de clés n'existe pas', mais uniquement via WCF

StackOverflow https://stackoverflow.com/questions/602345

  •  03-07-2019
  •  | 
  •  

Question

J'ai un code qui appelle un service Web tiers sécurisé à l'aide de la certification X.509.

Si j'appelle le code directement (à l'aide d'un test unitaire), il fonctionne sans problème.

Une fois déployé, ce code sera appelé via un service WCF. J'ai ajouté un deuxième test unitaire qui appelle le service WCF, mais cela échoue avec une CryptographicException , le message "Le jeu de clés n'existe pas & lorsque j'appelle une méthode sur la troisième service Web de parti.

Je suppose que cela est dû au fait que mon service WCF tentera d'appeler le service Web tiers en utilisant un utilisateur différent de celui que je suis.

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

Était-ce utile?

La solution

Ce sera probablement un problème d'autorisations sur le certificat.

Lorsque vous exécuterez un test unitaire, vous allez l'exécuter sous votre propre contexte utilisateur qui (selon le magasin dans lequel se trouve le certificat client ) aura accès à la clé privée de ce certificat.

Toutefois, si votre service WCF est hébergé sous IIS ou en tant que service Windows, il fonctionnera probablement sous un compte de service (service réseau, service local ou un autre compte restreint).

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

.

Autres conseils

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

  1. Démarrer - > Run - > MMC
  2. Fichier - > Ajouter / Supprimer un composant logiciel enfichable
  3. Ajouter le composant logiciel enfichable Certificats
  4. Sélectionnez un compte d'ordinateur, puis cliquez sur
  5. .
  6. Sélectionnez l'ordinateur local (par défaut), puis cliquez sur Terminer
  7. Sur le panneau de gauche depuis la racine de la console, accédez à  Certificats (ordinateur local) - > Personnel - > Certificats
  8. Votre certificat sera probablement ici.
  9. Faites un clic droit sur votre certificat - > Toutes les tâches - > Gérer les clés privées
  10. Définissez vos paramètres de clé privée ici.

J'ai eu le même problème la nuit dernière. Les autorisations sur la clé privée ont été définies correctement, tout semblait aller bien sauf l'erreur relative au jeu de clés. En fin de compte, il s'est avéré que le certificat avait d'abord été importé dans le magasin d'utilisateurs actuel, puis transféré dans le magasin de machines local. Cependant - cela n'a pas déplacé la clé privée, qui était toujours dans le

C: \ Documents and settngs \ Administrateur ...

au lieu de

C: \ Documents and settngs \ Tous les utilisateurs ...

Bien que les autorisations sur la clé aient été définies correctement, ASPNET n'a pas pu y accéder. Lorsque nous avons réimporté le certificat afin que la clé privée soit placée dans la branche Tous les utilisateurs, le problème a disparu.

Pour résoudre le «jeu de clés inexistant» lors de la navigation à partir d'IIS: Cela peut être pour l'autorisation privée

Pour afficher et autoriser:

  1. Exécuter > mmc > yes
  2. cliquez sur le fichier
  3. Cliquez sur Ajouter / Supprimer un composant logiciel enfichable…
  4. Double-cliquez sur le certificat
  5. Compte d'ordinateur
  6. Suivant
  7. Terminer
  8. ok
  9. Cliquez sur Certificats (ordinateur local)
  10. .
  11. Cliquez sur Personnel
  12. Cliquez sur Certificats

Pour donner la permission:

  1. Cliquez avec le bouton droit sur le nom du certificat
  2. Toutes les tâches > Gérer les clés privées…
  3. Ajouter et donner le privilège (ajouter IIS_IUSRS et lui donner le privilège fonctionne pour moi)

Avait le même problème en essayant d'exécuter l'application WCF à partir de Visual Studio. Résolu en exécutant Visual Studio en tant qu'administrateur.

J'ai rencontré ce problème, mes certificats étaient dotés d'une clé privée, mais je recevais cette erreur ( "Le jeu de clés n'existe pas" )

.

Cause: votre site Web est exécuté sous "Services réseau". compte ou ayant moins de privilèges.

Solution : remplacez l'identité du pool d'applications par "Système local", réinitialisez IIS et vérifiez à nouveau. S'il commence à fonctionner, c'est un problème d'autorisation / privilège, vous pouvez emprunter l'identité d'autres personnes, puis utiliser d'autres comptes.

Totalement frustrant, j’ai eu le même problème et j’ai essayé la plupart des choses ci-dessus. Le certificat exporté disposait correctement des autorisations nécessaires pour lire le fichier dans C: \ ProgramData \ Microsoft \ Crypto \ RSA \ MachineKeys . Toutefois, il s'avère que le dossier n'était pas autorisé. L'a ajouté et cela a fonctionné

J'ai aussi un problème similaire. J'ai utilisé la commande

findprivatekey root localmachine -n "CN="CertName" 

le résultat indique que la clé privée se trouve dans le dossier c: \ ProgramData au lieu de C: \ Documents and settngs \ All users ..

Lorsque je supprime la clé du dossier c: \ ProgramData, exécutez à nouveau la commande findPrivatekey n'aboutit pas. c'est à dire. il ne trouve pas la clé.

Mais si je recherche la même clé renvoyée par une commande précédente, je peux toujours trouver la clé dans

C: \ Documents and settngs \ Tous les utilisateurs ..

Donc, à ma connaissance, IIS ou la WCF hébergée ne trouve pas la clé privée dans C: \ Documents and settngs \ All users ..

Le message d'erreur suivant s'affiche: CryptographicException "Le jeu de clés n'existe pas" lorsque j'exécute l'application MVC.

La solution était: donner accès aux certificats personnels au compte sous lequel le pool d'applications est exécuté. Dans mon cas, il fallait ajouter IIS_IUSRS et choisir le bon emplacement a résolu ce problème.

RC on the Certificate - > All tasks -> Manage Private Keys -> Add->  
For the From this location : Click on Locations and make sure to select the Server name. 
In the Enter the object names to select : IIS_IUSRS and click ok. 

J'ai trouvé des informations manquantes qui m'ont aidé à faire passer mon service WCF avec une sécurité de niveau Message au-delà de "L'ensemble de clés inexistant". que j'ai continué à courir malgré l'octroi d'autorisations à toutes les clés générées à partir des exemples sur Internet.

J'ai finalement importé la clé privée dans le magasin de personnes de confiance sur la machine locale, puis accordé les autorisations appropriées à la clé privée.

Ceci a rempli les blancs pour moi et m'a enfin permis d'implémenter le service WCF avec une sécurité au niveau message. Je construis une WCF qui doit être conforme à la norme HIPPA.

Si vous utilisez ApplicationPoolIdentity pour votre pool d'applications, vous pouvez rencontrer des problèmes pour spécifier l'autorisation pour ce " virtual " utilisateur dans l'éditeur de registre (cet utilisateur n'existe pas dans le système).

Utilisez donc un sous-outil - un outil de ligne de commande qui active les ACL de registre définis, ou quelque chose comme ça.

Je voulais juste ajouter une réponse de vérification de la santé mentale. J'obtenais exactement la même erreur même après avoir installé les certificats dans les bons magasins sur mes machines et obtenu tous les privilèges de sécurité appropriés pour le client. Il s'avère que j'ai mélangé mon clientCertificate et mon certificat de service. Si vous avez essayé tout ce qui précède, je vérifierais que vous avez ces deux droits. Une fois que j'ai fait cela, mon application a appelé le service Web. Encore une fois, juste un vérificateur de santé mentale.

Réception de cette erreur lors de l'utilisation du Fedlet OpenAM sur IIS7

La modification du compte d'utilisateur du site Web par défaut a résolu le problème. Idéalement, vous voudriez que ce soit un compte de service. Peut-être même le compte IUSR. Suggérez de rechercher des méthodes pour le durcissement d’IIS afin de bien le comprendre.

J'ai touché ceci dans mon projet de service fabric après que le certificat utilisé pour s'authentifier auprès de notre emplacement de stockage de clés a expiré et qu'il a été pivoté, ce qui a modifié l'empreinte numérique. J'ai eu cette erreur parce que j'avais raté la mise à jour de l'empreinte numérique dans le fichier applicationManifest.xml de ce bloc qui fait exactement ce que d'autres réponses ont suggéré: donner à NETWORK SERVICE (sous lequel tous mes exés sont exécutés, config standard pour un cluster azur servicefabric) accédez à l’emplacement de notre magasin de produits certal LOCALMACHINE \ MY.

Notez le "X509FindValue". valeur d'attribut.

<!-- this block added to allow low priv processes (such as service fabric processes) that run as NETWORK SERVICE to read certificates from the store -->
  <Principals>
    <Users>
      <User Name="NetworkService" AccountType="NetworkService" />
    </Users>
  </Principals>
  <Policies>
    <SecurityAccessPolicies>
      <SecurityAccessPolicy ResourceRef="AzureKeyvaultClientCertificate" PrincipalRef="NetworkService" GrantRights="Full" ResourceType="Certificate" />
    </SecurityAccessPolicies>
  </Policies>
  <Certificates>
    <SecretsCertificate X509FindValue="[[THIS KEY ALSO NEEDS TO BE UPDATED]]" Name="AzureKeyvaultClientCertificate" />
  </Certificates>
  <!-- end block -->

Je viens de réinstaller mon certificat sur une machine locale, puis tout fonctionne bien

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top