web-dev-qa-db-fra.com

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 certificat client valide appelé foo.pfx m'a été fourni. Il y a un mot de passe sur le certificat lui-même.

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

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

public X509Certificate GetCertificateFromDisk(){
    try{             

       string certPath = ConfigurationManager.AppSettings["MyCertPath"].ToString(); 
       //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"?

21
p.campbell

Il s’est avéré que j’essayais de créer un certificat à partir du fichier .pfx au lieu du fichier .cer.

Leçon apprise...

  • Les fichiers .cer sont un certificat X.509 sous forme binaire. Ils sont DER encodés .
  • Les fichiers .pfx sont fichiers de conteneur . Également codé en DER. Ils contiennent non seulement des certificats, mais également des clés privées sous forme cryptée.
30
p.campbell

Vous devrez peut-être utiliser X509Certificate2() avec un paramètre de X509KeyStorageFlags.MachineKeySet à la place. Cela a résolu un problème similaire que nous avions. Nous remercions le site Web original qui l’a suggéré: http://vdachev.net/2012/03/07/c-sharp-error-creating-x509certificate2-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’obtenir Accès 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 la clé de stockage 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 certificat dans son magasin personnel (puis , Puis le supprimer à nouveau).

Une autre solution consiste à passer un paramètre supplémentaire au constructeur - un drapeau indiquant que les clés privées sont (supposées être) stockées dans l'ordinateur local - X509KeyStorageFlags.MachineKeySet, comme ceci: var certificate = new X509Certificate2(fileName, password, X509KeyStorageFlags.MachineKeySet);

Pour un PFX sans mot de passe, le mot de passe peut être spécifié en tant que string.Empty.

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

10
Chris J

Selon votre situation, vous devrez probablement installer le certificat 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 le Foo.cer par une exportation du certificat installé sur le serveur. (Installez le certificat à 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 certification. 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'accès 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 accès à une clé privée pour le compte

    (SERVERNAME)\IIS_WPG
    

Téléchargez WinHttpCertCfg.msihere qui installe le fichier exe.

Vous trouverez plus d'informations sur l'utilisation de la configuration de certificat here .

Ensuite, cela revient simplement à la façon dont vous faites votre push Push.

//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
string 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 certificat, mais que je ne savais pas exactement ce que vous deviez faire avec votre certificat, ce qui pourrait ne pas être la même chose pour vous.

7
benjamin

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

5
Douwe

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

Le mot de passe réseau spécifié est incorrect

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

_certificate = new X509Certificate2();
_certificate.Import(certificatePath);

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

_certificate.Import(certificatePath, "mypasswordusedtocreatethecertificate",  X509KeyStorageFlags.MachineKeySet);
3
Dhanuka777

Vous devrez peut-être X509KeyStorageFlags.MachineKeySet.

J'utilise un certificat d'emploi Web.

1
ABB

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

0
Peska