J'ai une application WinForms qui consomme un WCF, et passe en paramètre à une fonction un certificat:
mySvcClient.SendDocument(cert.Export(X509ContentType.SerializedCert, "password"));
...
Dans le service WCF, j'ai recréé le certificat à partir du tableau d'octets:
public void SendDocument (byte[] binaryCert)
{
X509Certificate2 cert = new X509Certificate2(binaryCert, "password");
...
Mais lors de l'utilisation du certificat pour signer un xml, j'ai eu l'erreur "Keyset n'existe pas":
if (cert.HasPrivateKey) // WORKS!!!
{
signedXml.SigningKey = cert.PrivateKey; // THROW "keyset does not exist" EXCEPTION
...
Sur mon ordinateur, l'application fonctionne à 100%! Mais dans le WebServer, j'ai eu cette erreur!
La question est: même X509Certificate2 recréé à partir d'un tableau d'octets, j'ai besoin d'une autorisation spéciale pour accéder à la clé privée?
Je vous remercie!
Si vous utilisez Windows Server 2008 ou Windows 7, vous devez avoir l'autorisation de lire la clé privée.
FindPrivateKey My LocalMachine -n "CN = MyCert" –a
il renvoie le chemin: C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys [nom de fichier]
Accédez à ce chemin et ouvrez les propriétés du fichier
Accédez à l'onglet sécurité
Cliquez sur "Modifier" puis sur "Ajouter"
Dans la boîte de dialogue ouverte, écrivez: IIS AppPool\[votre nom de pool d'applications] et cliquez sur OK
Votre pool d'applications est désormais autorisé à lire cette clé privée.
J'ai rencontré ce problème, mes certificats contenaient 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ésea" ou avec moins de privilèges.
Solution: Modifiez l'identité du pool d'applications en "Système local", réinitialiser IIS et vérifiez à nouveau. S'il commence à fonctionner, c'est un problème de permission/moins de privilèges, vous pouvez également emprunter l'identité d'autres utilisateurs.
J'étais confronté au même problème, et je ne sais pas comment (honte à moi), mais cela a fonctionné:
var certificate = new X509Certificate2(filePath, password,
X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet);
certificate.PrivateKey; // before: error "KeySet does not exist"!
using (certificate.GetRSAPrivateKey()) { } // pure black magic
certificate.PrivateKey; // after: just works! lol
J'espère que quelqu'un pourra répondre à ce mystère.
La réponse de Vano Maisuradze fonctionne. Si vous recherchez l'outil FindPrivateKey, il est inclus dans les exemples Windows Communication Foundation (WCF) et Windows Workflow Foundation (WF) pour .NET Framework 4, que vous trouverez ici: http://www.Microsoft. com/en-us/download/confirmation.aspx? id = 21459
Une fois téléchargé et extrait, ouvrez le projet: WF_WCF_Samples\WCF\Setup\FindPrivateKey\CS dans Visual Studio et compilez-le. Ouvrez ensuite l'invite de commande et accédez à: WF_WCF_Samples\WCF\Setup\FindPrivateKey\CS\bin
Ensuite, continuez avec la réponse de Vano Maisuradze
Je pense que le problème est que vous devez ajouter la clé au magasin de certificats de la machine.
Les comptes d'identité du pool d'applications n'ont pas accès au magasin de certificats par défaut.
Soit vous changez en Network Services
compte comme indiqué par Vaibhav.Inspired ou vous donnez accès au certificat.
Pour autoriser l'accès, exécutez la commande suivante:
WinHttpCertCfg.exe -g -c LOCAL_MACHINE\MY -s "IssuedToName" -a "AccountName"
Remarques:
- The tool may need to be installed first. The setup will place the tool at `C:\Program Files (x86)\Windows Resource Kits\Tools\WinHttpCertCfg.exe`.
- `IssuedName` is the issuer property of the certificate that the application will attempt to access
- The command must be run from command Prompt with elevated privileges
Référence: https://support.Microsoft.com/en-us/help/901183/how-to-call-a-web-service-by-using-a-client-certificate-for-authentica Étape 2
Vous devez également activer le Mark this key as exportable
option lors de l'installation du certificat.