web-dev-qa-db-fra.com

X509Certificate - Le jeu de clés n'existe pas

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!

29
BrunoXP

Si vous utilisez Windows Server 2008 ou Windows 7, vous devez avoir l'autorisation de lire la clé privée.

  1. utilisez l'outil FindPrivateKey pour trouver le chemin. Par exemple:

FindPrivateKey My LocalMachine -n ​​"CN = MyCert" –a

il renvoie le chemin: C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys [nom de fichier]

  1. Accédez à ce chemin et ouvrez les propriétés du fichier

  2. Accédez à l'onglet sécurité

  3. Cliquez sur "Modifier" puis sur "Ajouter"

  4. 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.

35
Vano Maisuradze

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.

30
Vaibhav.Inspired

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.

12
Kim Tranjan

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

4
ajliptak

Je pense que le problème est que vous devez ajouter la clé au magasin de certificats de la machine.

1
Xint0

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.

0
ByteArtisan