example c# ssl-certificate x509certificate

c# - example - X509Certificate.CreateFromCertFile: la contraseña de red especificada no es correcta



x509certificate2 c# example (7)

Tengo una aplicación .NET que quiero usar como cliente para llamar a un servicio web SSL SOAP. He recibido un certificado de cliente válido llamado foo.pfx . Hay una contraseña en el propio certificado.

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

Para llamar al servicio web, necesito adjuntar el certificado del 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 es 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 está anulado y solo tiene un argumento: la ruta.

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


Dependiendo de su situación, es probable que primero deba instalar el certificado en el servidor para aumentar 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. (Instale el pfx archivo pfx y luego pfx a un archivo cer ).

  • Comando para IIS6 para permitir el acceso de grupo IIS_WPG a la clave cert. winhttpcertcfg instalar winhttpcertcfg (Puede seguir el enlace de abajo para obtener su propia copia).

    C: / Archivos de programa / Kits de recursos de Windows / Herramientas> winhttpcertcfg -i (Ruta al archivo pfx, por ejemplo. E: / Certs / Foo.pfx) -c LOCAL_MACHINE / My -a IIS_WPG -p (Contraseña para el archivo pfx)

  • Escupe información clave y otorga privilegios.

    Concesión de acceso a la clave privada por cuenta:

    (SERVERNAME)/IIS_WPG

Descargue WinHttpCertCfg.msi here que instala el WinHttpCertCfg.msi exe.

Más información sobre cómo utilizar la configuración de cert se puede encontrar here .

Luego simplemente vuelve a la forma en que estás haciendo tu empuje certificado.

//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);

Esta es la forma en que aprobé el certificado pero no estoy seguro exactamente de lo que necesita hacer con su certificado, por lo que podría no ser lo mismo para usted.


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 ese almacén.


En mi caso, el cambio de Identidad a NetworkService en el Grupo de aplicaciones resolvió este problema.


En mi caso, estaba tratando de ejecutarme en el modo de aplicación privada y obtuve el mismo error.

La contraseña de red especificada no es correcta

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

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

Luego cambié la importación para usar un método de sobrecarga que usa la contraseña,

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


Es posible que necesite X509Certificate2() con un parámetro de X509KeyStorageFlags.MachineKeySet en X509KeyStorageFlags.MachineKeySet lugar. Esto solucionó un problema similar que teníamos. Gracias 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

La causa del problema no parece tener mucho que ver con los mensajes de error. Por alguna razón, el constructor está intentando obtener acceso al almacén de claves privadas, aunque la clave privada está almacenada 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 pueden abrirlo. Es probable que el almacén de claves de usuario para la cuenta seleccionada ni siquiera exista.

Solución

Una cosa que podría intentar es crear un almacén de claves de usuario iniciando sesión en la cuenta e importando un certificado en su almacén personal (y luego eliminarlo de nuevo).

Otra solución es pasar un parámetro adicional al constructor: una marca que indica que las claves privadas están (supuestamente) almacenadas en la computadora local - X509KeyStorageFlags.MachineKeySet, como esta: var certificate = new X509Certificate2(fileName, password, X509KeyStorageFlags.MachineKeySet);

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

Consulte también https://.com/a/8291956/130352


Es posible que necesite X509KeyStorageFlags.MachineKeySet.

Estoy usando el certificado de trabajo web.


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

Lección aprendida...

  • Los archivos .cer son un certificado X.509 en formato binario. Están codificados en DER .
  • Los archivos .pfx son archivos contenedores . También DER codificado. Contienen no solo certificados, sino también claves privadas en forma encriptada.