X509Certificate.CreateFromCertFile – le mot de passe réseau spécifié n’est pas correct

Je souhaite utiliser une application .NET en tant que client pour appeler un service Web SSL SOAP. Un certificate client valide appelé foo.pfx m’a été fourni. Il y a un mot de passe sur le certificate lui-même.

J’ai localisé le certificate à l’emplacement suivant: C:\certs\foo.pfx

Pour appeler le service Web, je dois joindre le certificate client. Voici le code:

 public X509Certificate GetCertificateFromDisk(){ try{ ssortingng certPath = ConfigurationManager.AppSettings["MyCertPath"].ToSsortingng(); //this evaluates to "c:\\certs\\foo.pfx". So far so good. X509Certificate myCert = X509Certificate.CreateFromCertFile(certPath); // exception is raised here! "The specified network password is not correct" return cert; } catch (Exception ex){ throw; } } 

Il semble que l’exception concerne l’application .NET qui tente de lire le disque. La méthode CreateFromCertFile est une méthode statique devant créer une nouvelle instance de X509Certificate. La méthode n’est pas remplacée et n’a qu’un seul argument: le chemin.

Lorsque j’inspecte l’exception, je trouve ceci:

 _COMPlusExceptionCode = -532459699 Source=mscorlib 

Question: Quelqu’un sait-il quelle est la cause de l’exception “Le mot de passe réseau spécifié n’est pas correct”?

Il s’avère que j’essayais de créer un certificate à partir du fichier .pfx au lieu du fichier .cer.

Leçon apprise…

  • Les fichiers .cer sont un certificate X.509 sous forme binary. Ils sont encodés en DER .
  • Les fichiers .pfx sont des fichiers conteneurs . Également codé en DER. Ils contiennent non seulement des certificates, mais également des clés privées sous forme cryptée.

Vous devrez peut-être utiliser X509Certificate2() avec un paramètre de X509KeyStorageFlags.MachineKeySet . Cela a résolu un problème similaire que nous avions. Nous remercions le site Web original qui a suggéré cela: http://vdachev.net/2012/03/07/c-sharp-error-creating-x509certificatee2-from-a-pfx-or-p12-file-in-production/

Citant:

Cause

La cause du problème ne semble pas avoir grand chose à voir avec les messages d’erreur. Pour une raison quelconque, le constructeur tente d’accéder au magasin de clés privées bien que la clé privée soit stockée dans le fichier en cours d’ouverture. Par défaut, le magasin de clés utilisateur est utilisé mais ASP.NET (et probablement les services Windows non interactifs en général) ne sont pas autorisés à l’ouvrir. Il est fort probable que le magasin de clés utilisateur du compte sélectionné n’existe même pas.

Solution

Vous pouvez également essayer de créer un magasin de clés utilisateur en vous connectant au compte et en important un certificate dans son magasin personnel (puis de le supprimer à nouveau).

Une autre solution consiste à transmettre un paramètre supplémentaire au constructeur – un indicateur indiquant que les clés privées sont (supposées être) stockées dans l’ordinateur local – X509KeyStorageFlags.MachineKeySet, comme suit: var certificatee = new X509Certificate2(fileName, password, X509KeyStorageFlags.MachineKeySet);

Pour un PFX sans mot de passe, le mot de passe peut être spécifié sous la forme ssortingng.Empty .

Voir aussi https://stackoverflow.com/a/8291956/130352

Selon votre situation, vous devrez probablement installer le certificate sur le serveur pour obtenir le niveau de confiance avant d’exporter le fichier .cer .

Je devais faire cela pour un projet similaire et voici mes notes sur la façon dont cela avait été accompli.

Remplacez Foo.cer par une exportation du certificate installé sur le serveur. (Installez le certificate à partir du fichier pfx puis exportez-le dans un fichier cer .)

  • Commande pour IIS6 permettant au groupe IIS_WPG d’accéder à la clé de certificateion. Besoin d’installer winhttpcertcfg (vous pouvez suivre le lien ci-dessous pour récupérer votre propre copie).

    C: \ Program Files \ Kits de ressources Windows \ Tools> winhttpcertcfg -i (chemin d’access au fichier pfx, par exemple, e: \ Certs \ Foo.pfx) -c LOCAL_MACHINE \ Mon -a IIS_WPG -p (mot de passe pour le fichier pfx)

  • Crache des informations clés et accorde des privilèges

    Octroi d’un access à une clé privée pour le compte:

     (SERVERNAME)\IIS_WPG 

Téléchargez WinHttpCertCfg.msi ici pour installer le fichier exe.

Vous trouverez plus d’informations sur l’utilisation de la configuration de certificate ici .

Ensuite, cela revient simplement à la façon dont vous faites votre poussée de cert.

 //Cert Challenge URL Uri requestURI = new Uri("https://someurl"); //Create the Request Object HttpWebRequest pageRequest = (HttpWebRequest)WebRequest.Create(requestURI); //After installing the cert on the server export a client cert to the working directory as Foo.cer ssortingng certFile = MapPath("Foo.cer"); X509Certificate cert = X509Certificate.CreateFromCertFile(certFile); //Set the Request Object parameters pageRequest.ContentType = "application/x-www-form-urlencoded"; pageRequest.Method = "POST"; pageRequest.AllowWriteStreamBuffering = false; pageRequest.AllowAutoRedirect = false; pageRequest.ClientCertificates.Add(cert); 

C’est ainsi que j’ai passé le certificate mais que je ne savais pas exactement ce que vous deviez faire avec votre certificate, ce qui pourrait ne pas être la même chose pour vous.

Le message d’erreur “le mot de passe réseau spécifié n’est pas correct” est également renvoyé lorsque le certificate que vous essayez d’importer dans l’un des magasins de système d’exploitation est déjà présent dans ce magasin.

Dans mon cas, j’essayais de courir en mode Application privée et j’ai eu la même erreur.

Le mot de passe réseau spécifié n’est pas correct

Le constructeur PrivateAuthenticator (dans Xero.Api.Example.Applications.Private ) a tenté d’importer le certificate en supposant qu’aucun mot de passe n’a été défini lors de la création du certificate.

 _certificatee = new X509Certificate2(); _certificatee.Import(certificateePath); 

Puis j’ai modifié l’importation pour utiliser une méthode de surcharge qui utilise le mot de passe,

 _certificatee.Import(certificateePath, "mypasswordusedtocreatethecertificatee", X509KeyStorageFlags.MachineKeySet); 

Vous devrez peut-être X509KeyStorageFlags.MachineKeySet.

J’utilise un certificate d’emploi Web.

Dans mon cas, la modification d’Identity en NetworkService dans le pool d’applications a résolu ce problème.