2009-05-22 21 views
16

Possiedo un'applicazione .NET che desidero utilizzare come client per chiamare un servizio Web SOAP SSL. Sono stato fornito con un certificato client valido chiamato foo.pfx. C'è una password sul certificato stesso.X509Certificate.CreateFromCertFile - la password di rete specificata non è corretta

ho localizzato il certificato al seguente indirizzo: C:\certs\foo.pfx

per chiamare il servizio web, ho bisogno di 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 è dietro l'applicazione .NET cercando di leggere il disco. Il metodo CreateFromCertFile è un metodo statico che dovrebbe creare una nuova istanza di X509Certificate. Il metodo non è sovrascritto e ha solo un argomento: il percorso.

Quando ho ispezionare l'eccezione, ho trovato questo:

_COMPlusExceptionCode = -532459699 
Source=mscorlib 

Domanda: qualcuno sa quale sia la causa dell'eccezione "La password di rete specificata non è corretta"?

risposta

25

Si scopre che stavo cercando di creare un certificato da .pfx anziché dal file .cer.

Lezione imparata ...

  • cer file sono un certificato X.509 in forma binaria. Sono DER encoded.
  • .pfx file sono file contenitore. Anche codificato DER. Contengono non solo certificati, ma anche chiavi private in forma crittografata.
+2

Le tue informazioni salvate – user217648

+0

@ p.campell è possibile caricare un certificato .pfx da una directory locale e ottenere l'identificazione digitale di tale certificato? – drgmak

6

A seconda della situazione, è necessario installare prima il certificato sul server per ottenere il livello di attendibilità prima di esportare il file .cer.

Ho dovuto farlo per un progetto simile e qui c'erano i miei appunti su come è stato realizzato.

Sostituire Foo.cer con un'esportazione 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. È necessario installare winhttpcertcfg (È possibile seguire il link sottostante per prendere la propria 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 e sovvenzioni chiave privilegio

    Concessione accesso chiave privata per conto:

    (SERVERNAME)\IIS_WPG 
    

Download WinHttpCertCfg.msihere che installa l'exe.

È possibile trovare ulteriori informazioni su come utilizzare la configurazione di cert here.

Quindi si torna semplicemente a come si sta facendo il push 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 
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); 

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

5

Il 'la password di rete specificata non è corretto' 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.

6

Potrebbe essere necessario l'utente X509Certificate2() con un parametro di X509KeyStorageFlags.MachineKeySet. Questo ha 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 i messaggi di errore . Per qualche motivo, il costruttore sta tentando di ottenere l'accesso all'archivio delle chiavi private anche se la chiave privata è memorizzata nel file aperto . Per impostazione predefinita viene utilizzato il keystore utente, ma l'ASP.NET (e probabilmente i servizi Windows non interattivi in ​​generale) sono non autorizzati ad aprirlo. È probabile che l'archivio chiavi utente per l'account selezionato non esiste nemmeno.

Soluzione

Una cosa che si potrebbe provare è la creazione di un archivio chiavi utente accedendo 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) immagazzinate nella computer locale - X509KeyStorageFlags.MachineKeySet, in questo modo: var certificate = new X509Certificate2(fileName, password, X509KeyStorageFlags.MachineKeySet);

Per un PFX senza password, la password può essere specificata come string.Empty.

Vedi anche https://stackoverflow.com/a/8291956/130352

2

Nel mio caso stavo cercando per l'esecuzione in modalità di Application privato e ho ottenuto lo stesso errore.

La password di rete specificata non è corretta

Il costruttore PrivateAuthenticator (in Xero.Api.Example.Applications.Private) stava cercando di importare il certificato supponendo che non v'è alcuna password definita durante la creazione del certificato.

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

Poi ho cambiato l'importazione di utilizzare un metodo di overload, che utilizza la password,

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

Potrebbe essere necessario X509KeyStorageFlags.MachineKeySet.

Sto utilizzando il certificato dal lavoro Web.

Problemi correlati