X509Certificate.CreateFromCertFile: la password di rete specificata non è corretta
-
23-08-2019 - |
Domanda
Ho un'applicazione .NET che desidero utilizzare come client per chiamare un servizio Web SOAP SSL.Mi è stato fornito un certificato client valido chiamato foo.pfx
.C'è una password sul certificato stesso.
Ho individuato il certificato nel seguente percorso: C:\certs\foo.pfx
Per chiamare il servizio web, devo allegare il certificato client.Ecco il codice:
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;
}
}
Sembra che l'eccezione riguardi l'applicazione .NET che tenta di leggere il disco.Il metodo CreateFromCertFile
è un metodo statico che dovrebbe creare una nuova istanza di X509Certificate.Il metodo non viene sovrascritto e ha un solo argomento:il sentiero.
Quando controllo l'eccezione, trovo questo:
_COMPlusExceptionCode = -532459699
Source=mscorlib
Domanda:qualcuno sa qual è la causa dell'eccezione "La password di rete specificata non è corretta"?
Soluzione
Risulta che stavo cercando di creare un certificato dal pfx invece del file cer.
Abbiamo imparato la lezione ...
- i file con estensione cer sono un certificato X.509 in forma binaria. Sono codificato DER .
- .pfx sono file contenitore . Inoltre codificato DER. Essi contengono non solo i certificati, ma anche le chiavi private in forma criptata.
Altri suggerimenti
Potrebbe essere necessario X509Certificate2()
utente con un parametro di X509KeyStorageFlags.MachineKeySet
invece. Questo risolto un problema simile che abbiamo avuto. Credito al sito originale che ha suggerito questo: http://vdachev.net/2012/03/07/c-sharp-error-creating-x509certificate2-from-a-pfx-or-p12-file-in-production /
Citando:
Causa
La causa del problema non sembra avere molto a che fare con la messaggio di errore. Per qualche motivo il costruttore sta cercando di ottenere accesso al negozio chiave privata anche se la chiave privata è in immagazzinato nel file che si apre. Per impostazione predefinita, viene utilizzato l'archivio chiavi utente, ma ASP.NET (e servizi probabilmente non interattivi di Windows in generale) sono non ha permesso di aprirlo. Le probabilità sono chiavi utente per il account selezionato non esiste nemmeno.
Soluzione
Una cosa che si potrebbe provare è la creazione di un archivio chiavi utente accedendo al l'account e l'importazione di un certificato nel suo negozio Personal (e poi estrarla).
Un'altra soluzione è quella di passare un parametro aggiuntivo al costruttore - un flag che indica le chiavi private sono (dovrebbe essere) memorizzati in il computer locale - X509KeyStorageFlags.MachineKeySet, come questo:
var certificate = new X509Certificate2(fileName, password, X509KeyStorageFlags.MachineKeySet);
Per un PFX senza password, quindi la password può essere specificato come string.Empty
.
Si veda anche https://stackoverflow.com/a/8291956/130352
A seconda della situazione probabilmente è necessario installare il certificato sul server prima di ottenere il livello di fiducia prima di esportare il file .cer
.
ho dovuto fare questo per un progetto simile e qui erano le mie note su come è stato realizzato.
Sostituire la Foo.cer
con un export del certificato installato sul server. (Installare il CERT dal file pfx
e quindi esportare in un file cer
.)
-
Comando per IIS6 per consentire l'accesso gruppo IIS_WPG alla chiave cert. Necessità di installare
winhttpcertcfg
(È possibile seguire il link qui sotto per afferrare la vostra copia).C: \ Program Files \ Windows Resource Kits \ Tools> winhttpcertcfg -i (Percorso del file pfx, ad esempio, e:. \ Certs \ Foo.pfx) -c LOCAL_MACHINE \ My -a IIS_WPG -p (password per il file pfx )
-
sputa fuori informazioni chiave e concede il privilegio
La concessione di accesso chiave privata per conto:
(SERVERNAME)\IIS_WPG
WinHttpCertCfg.msi href="http://www.microsoft.com/downloads/details.aspx?familyid=c42e27ac-3409-40e9-8667-c748e422833f&displaylang=en" rel="nofollow noreferrer"> qui che installa l'exe.
Più informazioni su come utilizzare la configurazione cert può essere trovato qui .
Poi si va solo a come si sta facendo il vostro cert spinta.
//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);
Questa come ho passato il CERT ma non sicuro di quello che si ha bisogno di fare con il vostro cert quindi questo potrebbe non essere lo stesso per voi.
Il 'la password di rete specificata non è corretta' messaggio di errore viene restituito anche se il certificato che si sta tentando di importare in uno dei negozi del sistema operativo è già presente in quel negozio.
Nel mio caso stavo provando a eseguire la modalità Applicazione privata e ho ricevuto lo stesso errore.
La password di rete specificata non è corretta
Il costruttore PrivateAuthenticator (in Xero.Api.Example.Applications.Private
) stava tentando di importare il certificato presupponendo che non fosse definita alcuna password durante la creazione del certificato.
_certificate = new X509Certificate2();
_certificate.Import(certificatePath);
Quindi ho modificato l'importazione per utilizzare un metodo di sovraccarico che utilizza la password,
_certificate.Import(certificatePath, "mypasswordusedtocreatethecertificate", X509KeyStorageFlags.MachineKeySet);
Potrebbe essere necessario X509KeyStorageFlags.MachineKeySet.
io sto usando certificato dal lavoro web.
Nel mio caso cambiando identità a NetworkService nel pool di applicazioni risolto questo problema.