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"?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top