X509Certificate.CreateFromCertFile - le mot de passe réseau spécifié n'est pas correct
j'ai une application .NET que je veux utiliser comme client pour appeler un service web SSL SOAP. J'ai reçu un certificat de client valide appelé foo.pfx
. Il y a un mot de passe sur le certificat lui-même.
j'ai localisé le certificat à l'endroit suivant: C:certsfoo.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:certsfoo.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;
}
}
on dirait que l'exception est autour de L'application .NET essayant de lire le disque. La méthode CreateFromCertFile
est une méthode statique qui devrait créer une nouvelle instance de X509Certificate. La méthode n'est pas écrasée, et n'a qu'un seul argument: le chemin.
Quand j'ai inspecter 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" ?
7 réponses
il S'avère que j'essayais de créer un certificat à partir du .pfx au lieu du.fichier cer.
Leçon apprise...
- .les fichiers cer sont des certificats X. 509 sous forme binaire. Ils sont DER encoded.
- .les fichiers pfx sont conteneur de fichiers. Aussi DER encoded. Ils contiennent non seulement des certificats, mais aussi les clés privées sous forme cryptée.
vous pourriez avoir besoin d'utiliser X509Certificate2()
avec un paramètre de X509KeyStorageFlags.MachineKeySet
à la place. Cette correction d'un problème similaire que nous avions. Source du site Web original qui suggérait ceci: http://vdachev.net/2012/03/07/c-sharp-error-creating-x509certificate2-from-a-pfx-or-p12-file-in-production/
le cite:
Cause
La cause du problème ne semble pas avoir beaucoup à faire avec la les messages d'erreur. Pour une raison quelconque, le le constructeur essaie d'obtenir accès au magasin de clés privées bien que la clé privée soit stockée dans le fichier ouvert. Par défaut, la clé user store est utilisée mais ASP.NET (et probablement les Services Windows non interactifs en général) sont pas autorisé à l'ouvrir. Les Chances sont le magasin de clé d'utilisateur pour le compte sélectionné n'existe même pas.
Solution
une chose que vous pouvez essayer est de créer un magasin de clés Utilisateur en vous connectant le compte et Importe un certificat dans son magasin personnel (et puis l'enlever à nouveau).
une autre solution est de passer un paramètre supplémentaire au constructeur – un drapeau indiquant les clés privées sont (censés ê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 êtrestring.Empty
.
Voir aussi https://stackoverflow.com/a/8291956/130352
selon votre situation, vous devrez probablement installer le certificat sur le serveur pour obtenir le niveau de confiance avant d'exporter le .cer
fichier.
j'ai dû faire cela pour un projet similaire et voici mes notes sur la façon dont il a été accompli.
Remplacer Foo.cer
avec un export du certificat installé sur le serveur. (Installer le cert de l' pfx
le fichier, puis l'exporter dans un cer
fichier.)
Commande pour IIS6 pour permettre au groupe IIS_WPG d'accéder à la clé cert. Besoin d'installer
winhttpcertcfg
(Vous pouvez suivre le lien ci-dessous pour saisir votre propre copie).C:\Program fichiers\Windows Resource Kits\Tools > winhttpcertcfg-i (chemin vers le fichier pfx, par ex. e:\Certs\Foo.pfx) - C LOCAL_MACHINE\My-A IIS_WPG-p (Password for pfx file)
Crache des informations clés et des subventions privilège
octroi de l'accès aux clés privées compte:
(SERVERNAME)\IIS_WPG
Télécharger WinHttpCertCfg.msi
ici qui installe l'exe.
plus d'informations sur la façon d'utiliser la config cert peuvent être trouvées ici.
puis ça revient juste à la façon dont vous faites votre Cert 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 comme ça que j'ai passé le cert mais je ne sais pas exactement ce que vous devez faire avec votre cert donc ce n'est peut-être pas la même chose pour vous.
le message d'erreur "le mot de passe réseau spécifié n'est pas correct" est également retourné lorsque le certificat que vous essayez d'importer dans l'un des magasins du système D'exploitation est déjà présent dans ce magasin.
dans mon cas, j'essayais d'exécuter 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 PrivateAuthenticator constructeur (dans Xero.Api.Example.Applications.Private
) essayait d'importer le certificat en supposant qu'il n'y a pas de mot de passe défini lors de la création du certificat.
_certificate = new X509Certificate2();
_certificate.Import(certificatePath);
puis j'ai changé l'import pour utiliser une méthode de surcharge qui utilise le mot de passe,
_certificate.Import(certificatePath, "mypasswordusedtocreatethecertificate", X509KeyStorageFlags.MachineKeySet);
vous pourriez avoir besoin de X509KeyStorageFlags.MachineKeySet.
j'utilise le certificat de web job.
dans mon cas, le changement D'identité vers NetworkService dans le Pool D'applications a résolu ce problème.