Pregunta

Tengo una aplicación .NET que quiero usar como cliente para llamar a un servicio web SSL SOAP.Me han proporcionado 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 se produce en torno a la aplicación .NET que intenta leer el disco.El método CreateFromCertFile es un método estático que debería crear una nueva instancia de X509Certificate.El método no se anula y tiene un solo argumento:el camino.

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

¿Fue útil?

Solución

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

lección aprendida ...

  • archivos .cer son un certificado X.509 en forma binaria. Son DER codificada .
  • .pfx archivos son archivos contenedores . También DER codificado. Que contienen no sólo los certificados, sino también las claves privadas en forma encriptada.

Otros consejos

Es posible que necesite X509Certificate2() usuario con un parámetro de X509KeyStorageFlags.MachineKeySet lugar. Esto fija un problema similar que teníamos. El crédito al sitio web original que sugirió lo siguiente: 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 no parece tener mucho que ver con el   error de mensajes. Por alguna razón, el constructor está tratando de conseguir   el acceso al almacén de claves privada, aunque la clave privada es almacenada en   en el archivo se abra. Por defecto se utiliza el almacén de claves de usuario, pero   ASP.NET (y servicios de Windows, probablemente no interactivas en general) están   no se les permite abrirlo. Es probable que el almacén de claves de usuario para el   cuenta seleccionada ni siquiera existe.

     

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   a continuación, quitar de nuevo).

     

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

Para una PFX sin contraseña, a continuación, la contraseña se puede especificar como string.Empty.

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

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

he tenido que hacer esto para un proyecto similar y aquí fueron mis notas sobre la forma en que se llevó a cabo.

Reemplazar 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.)

  • Comando para IIS6 para permitir el acceso al grupo IIS_WPG la tecla cert. Es necesario instalar winhttpcertcfg (Usted puede seguir el enlace de abajo para agarrar su propia copia).

      

    C: \ Archivos de programa \ Windows Resource Kits \ Tools> WinHttpCertCfg -i (Ruta al archivo PFX, por ejemplo, e:. \ Certificados \ Foo.pfx) c LOCAL_MACHINE \ Mi -a -p IIS_WPG (contraseña para el archivo PFX )

  • escupe información y subvenciones clave privilegio

    La concesión de acceso a la clave privada de la cuenta:

    (SERVERNAME)\IIS_WPG
    

WinHttpCertCfg.msi href="http://www.microsoft.com/downloads/details.aspx?familyid=c42e27ac-3409-40e9-8667-c748e422833f&displaylang=en" rel="nofollow noreferrer"> aquí que instala el exe.

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

Entonces, sólo se remonta 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.

El 'la contraseña de red especificada no es correcta' también se devuelve mensaje de error cuando el certificado que está intentando importar en una de las tiendas OS ya está presente en esa tienda.

En mi caso, estaba intentando ejecutar en el modo de aplicación privada y recibí 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 X509KeyStorageFlags.MachineKeySet.

Estoy utilizando el certificado de trabajo web.

En mi caso el cambio de identidad a NetworkService en el grupo de aplicaciones resuelto este problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top