J'ai du code qui appelle un service Web tiers sécurisé à l'aide de la certification X.509.
Si j'appelle le code directement (en utilisant un test unitaire), cela fonctionne sans aucun 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 un CryptographicException
message "Keyset does not exist"
lorsque j'appelle une méthode sur le service Web tiers.
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 moi-même.
Quelqu'un peut-il apporter un éclairage supplémentaire sur cette question?
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 ...
la source
J'ai eu un problème identique hier soir. Les autorisations sur la clé privée ont été définies correctement, tout allait apparemment bien sauf l'erreur Keyset n'existe pas. En fin de compte, il s'est avéré que le certificat était d'abord importé dans le magasin d'utilisateurs actuel, puis déplacé vers le magasin de machines local. Cependant, cela n'a pas déplacé la clé privée, qui était toujours dans le
C: \ Documents et paramètres \ Administrateur ...
au lieu de
C: \ Documents et paramètres \ Tous les utilisateurs ...
Bien que les autorisations sur la clé aient été correctement définies, ASPNET ne pouvait pas 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.
la source
Pour résoudre le problème «Le jeu de clés n'existe pas» lors de la navigation depuis IIS: Cela peut être pour l'autorisation privée
Pour afficher et donner l'autorisation:
Pour donner la permission:
la source
J'ai eu le même problème en essayant d'exécuter l'application WCF à partir de Visual Studio. Résolu le problème en exécutant Visual Studio en tant qu'administrateur.
la source
J'ai rencontré ce problème, mes certificats avaient une clé privée mais j'obtenais cette erreur ( "Le jeu de clés n'existe pas" )
Cause: Votre site Web fonctionne sous le compte "Services réseau" ou dispose de privilèges inférieurs.
Solution : modifiez l'identité du pool d'applications sur «Système local», réinitialisez IIS et vérifiez à nouveau. Si cela commence à fonctionner, il s'agit d'un problème d'autorisation / de privilège moindre, vous pouvez également emprunter l'identité en utilisant d'autres comptes.
la source
Totalement frustrant, j'ai eu le même problème et j'ai essayé la plupart de ce qui précède. Le certificat exporté avait correctement les autorisations de lecture du fichier
C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys
, mais il s'avère qu'il n'avait pas l'autorisation sur le dossier. Je l'ai ajouté et cela a fonctionnéla source
IISAPPPool\www.mywebsite.com
quel est le nom d'utilisateur Windows pour mon appool et cela a fonctionné :-)J'ai aussi un problème exactement similaire. J'ai utilisé la commande
le résultat montre 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, réexécutez la commande findPrivatekey échoue. c'est à dire. il ne trouve pas la clé.
Mais si je recherche la même clé retournée par la commande précédente, je peux toujours trouver la clé dans
C: \ Documents et paramètres \ Tous les utilisateurs ..
Donc, à ma connaissance, IIS ou le WCF hébergé ne trouve pas la clé privée de C: \ Documents and settngs \ All users ..
la source
J'obtenais l'erreur: CryptographicException «Keyset n'existe pas» lorsque j'exécute l'application MVC.
La solution était: pour donner accès aux certificats personnels au compte sous lequel le pool d'applications s'exécute. Dans mon cas, il s'agissait d'ajouter IIS_IUSRS et de choisir le bon emplacement a résolu ce problème.
la source
La réponse de Steve Sheldon a résolu le problème pour moi, cependant, comme je script des autorisations de certificat sans interface graphique, j'avais besoin d'une solution scriptable. J'ai eu du mal à trouver où ma clé privée était stockée. La clé privée n'était pas
-C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys
dedans, finalement j'ai trouvé qu'elle était réellement dedansC:\ProgramData\Microsoft\Crypto\Keys
. Ci-dessous, je décris comment j'ai découvert cela:J'ai essayé
FindPrivateKey
mais il n'a pas pu trouver la clé privée, et en utilisant PowerShell, il$cert.privatekey.cspkeycontainerinfo.uniquekeycontainername
était nul / vide.Heureusement,
certutil -store my
j'ai répertorié le certificat et m'a donné les détails dont j'avais besoin pour scénariser la solution.J'ai ensuite scanné le
c\ProgramData\Microsoft\Crypto\
dossier et trouvé le fichier 8787033f8ccb5836115b87acb_ca96c65a-4b42-a145-eee62128a dans C: \ ProgramData \ Microsoft \ Crypto \ Keys .Donner à mon compte de service un accès en lecture à ce fichier a résolu les problèmes pour moi
la source
J'ai trouvé des informations manquantes qui m'ont aidé à obtenir mon service WCF avec la sécurité au niveau du message au-delà du "Keyset n'existe pas" que j'ai continué à rencontrer 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 j'ai accordé à la clé privée les autorisations appropriées.
Cela a rempli les espaces vides pour moi et m'a finalement permis d'implémenter le service WCF avec la sécurité au niveau du message. Je construis un WCF qui doit être conforme HIPPA.
la source
Je viens de réinstaller mon certificat sur la machine locale et cela fonctionne bien
la source
Si vous utilisez ApplicationPoolIdentity pour votre pool d'applications, vous pouvez avoir des problèmes avec la spécification de l'autorisation pour cet utilisateur «virtuel» dans l'éditeur de registre (il n'y a pas un tel utilisateur dans le système).
Alors, utilisez subinacl - un outil de ligne de commande qui permet de définir des ACL de registre, ou quelque chose comme ça.
la source
Je voulais juste ajouter une réponse de vérification de cohérence. J'obtenais exactement la même erreur même après avoir installé les certificats dans les bons magasins sur mes machines et avoir tous les bons privilèges de sécurité pour le client. Il s'avère que j'ai confondu mon clientCertificate et mon certificat de service. Si vous avez essayé tout ce qui précède, je vérifierais que vous avez bien compris ces deux éléments. Une fois que j'ai fait cela, mon application a appelé avec succès le service Web. Encore une fois, juste un vérificateur de santé mentale.
la source
Reçu cette erreur lors de l'utilisation du Fedlet openAM sur IIS7
La modification du compte d'utilisateur pour le site Web par défaut a résolu le problème. Idéalement, vous voudriez qu'il s'agisse d'un compte de service. Peut-être même le compte de l'IUSR. Suggérez de rechercher des méthodes de durcissement IIS pour le clouer complètement.
la source
J'ai touché cela dans mon projet de structure de service après l'expiration et la rotation du certificat utilisé pour l'authentification par rapport à notre coffre de clés, ce qui a changé l'empreinte numérique. J'ai eu cette erreur parce que j'avais manqué la mise à jour de l'empreinte numérique dans le fichier applicationManifest.xml dans ce bloc qui fait précisément ce que les autres réponses ont suggéré - donner des autorisations de SERVICE RÉSEAU (que tous mes ex exécutent en tant que configuration standard pour le cluster azure servicefabric) accéder à l'emplacement du magasin LOCALMACHINE \ MY cert.
Notez la valeur d'attribut "X509FindValue".
la source
C'est la seule solution qui a fonctionné pour moi.
Référence 1
Référence 2
la source
la source