2009-05-22 163 views
16

Tengo una aplicación .NET que quiero usar como cliente para llamar a un servicio web SSL SOAP. Se me ha proporcionado un certificado de cliente válido llamado foo.pfx. Hay una contraseña en el certificado en sí.X509Certificate.CreateFromCertFile - la contraseña de red especificada no es correcta

He localizado el certificado en la siguiente ubicación: C:\certs\foo.pfx

Para llamar al servicio web, que tiene que adjuntar el certificado de cliente. Aquí está el código:

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; 
    } 
} 

Parece que la excepción está alrededor de la aplicación .NET que intenta leer el disco. El método CreateFromCertFile es un método estático que debe crear una nueva instancia de X509Certificate. El método no se reemplaza, y tiene solo un argumento: la ruta.

Cuando examino la excepción, encuentro esto:

_COMPlusExceptionCode = -532459699 
Source=mscorlib 

Pregunta: ¿alguien sabe cuál es la causa de la excepción "La contraseña de red especificada no es correcta"?

Respuesta

25

Resulta que estaba tratando de crear un certificado de .pfx en lugar del archivo .cer.

lección aprendida ...

  • .cer archivos son un certificado X.509 en forma binaria. Son DER encoded.
  • .pfx archivos son contenedores archivos. También DER codificado. No solo contienen certificados, sino también claves privadas en forma cifrada.
+2

Su información me ha salvado – user217648

+0

@ p.campell ¿es posible cargar un certificado .pfx desde un directorio local y obtener la huella digital de ese certificado? – drgmak

6

Dependiendo de su situación, es probable que deba instalar primero el certificado en el servidor para obtener el nivel de confianza antes de exportar el archivo .cer.

Tenía que hacer esto para un proyecto similar y aquí estaban mis notas sobre cómo se logró.

Reemplace el Foo.cer con una exportación del certificado instalado en el servidor. (Instalar el certificado desde el archivo pfx y luego exportarlo a un archivo cer.)

  • de comandos para IIS6 para permitir el acceso al grupo IIS_WPG la tecla cert. Necesita instalar winhttpcertcfg (Puede seguir el enlace a continuación para tomar su propia copia).

    C:. \ Archivos de programa \ Windows \ Kits de recursos Herramientas> WinHttpCertCfg -i (Ruta al archivo PFX, por ejemplo E: \ certs \ Foo.PFX) c LOCAL_MACHINE \ Mi -a -p IIS_WPG (contraseña para el archivo PFX)

  • escupe información y subvenciones clave privilegio

    Conceder acceso a la clave privada de la cuenta:

    (SERVERNAME)\IIS_WPG 
    

Descargue WinHttpCertCfg.msihere que instala el exe.

Se puede encontrar más información sobre cómo usar la configuración de certificado here.

Luego vuelve a la forma en que está haciendo su empuje 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); 

Esto cómo pasé el CERT pero no sabe exactamente lo que está necesitando que ver con su certificado por lo que este podría no ser el mismo para usted.

5

El mensaje de error "la contraseña de red especificada no es correcta" también se devuelve cuando el certificado que está intentando importar en uno de los almacenes del sistema operativo ya está presente en esa tienda.

6

Es posible que necesite el usuario X509Certificate2() con un parámetro de X509KeyStorageFlags.MachineKeySet en su lugar. Esto solucionó un problema similar que tuvimos. El crédito al sitio web original que sugirió esto: http://vdachev.net/2012/03/07/c-sharp-error-creating-x509certificate2-from-a-pfx-or-p12-file-in-production/

Citando:

Porque no parece

La causa del problema que tiene mucho que ver con los mensajes de error . Por algún motivo, el constructor intenta obtener el acceso al almacén de claves privadas, aunque la clave privada está en el archivo almacenado en el archivo que se está abriendo. De forma predeterminada, se utiliza el almacén de claves de usuario pero ASP.NET (y probablemente los servicios de Windows no interactivos en general) no se le permite abrirlo. Es probable que el almacén de claves del usuario para la cuenta seleccionada ni siquiera exista.

Solución

Una cosa que podría intentar es la creación de un almacén de claves de usuario, acceda a la cuenta e importar un certificado en su almacén personal (y luego lo elimina de nuevo).

Otra solución consiste en pasar un parámetro adicional al constructor - una bandera que indica las claves privadas son (se supone que) almacenado en el equipo local - X509KeyStorageFlags.MachineKeySet, así: var certificate = new X509Certificate2(fileName, password, X509KeyStorageFlags.MachineKeySet);

Para un PFX sin contraseña, la contraseña se puede especificar como string.Empty.

Ver también https://stackoverflow.com/a/8291956/130352

2

En mi caso yo estaba tratando de ejecutar en el modo de aplicación privada y tengo el mismo error.

La contraseña de red especificada no es correcta

El constructor PrivateAuthenticator (en Xero.Api.Example.Applications.Private) estaba tratando de importar el certificado suponiendo que no hay contraseña definida durante la creación del certificado.

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

Entonces cambió la importación de usar un método de sobrecarga que utiliza la contraseña,

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

Es posible que necesite X509KeyStorageFlags.MachineKeySet.

Estoy usando el certificado del trabajo web.

Cuestiones relacionadas