CryptographicException no fue manejada: el sistema no puede encontrar el archivo especificado

Estoy tratando de abrazar los misterios de la comunicación SSL y he encontrado un excelente tutorial en este sitio . Estaba tratando de probar mi propio certificado. Usando Visual Studio 2012, simplemente agregué un archivo existente (mi certificado en formato .pfx) y luego cambié la configuración de “certificado” y “contraseña” en app.config. Sin embargo, al intentar ejecutarlo, recibí un error:

CryptographicException no fue manejada: el sistema no puede encontrar el archivo especificado

Entonces, intenté lo mismo en mi servicio web. Ahí tengo algunos detalles más sobre el error:

System.Security.Cryptography.CryptographicException: System cannot find specified file. at System.Security.Cryptography.CryptographicException.ThrowCryptogaphicException(Int32 hr) at System.Security.Cryptography.X509Certificates.X509Utils._QueryCertFileType(String fileName) at System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromFile(String fileName, Object password, X509KeyStorageFlags keyStorageFlags) v System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(String fileName, String password) v TestServer.DataService.LoadSoap() vc:\Users\Administrator\Documents\Visual Studio 2012\Projects\TestServer\TestServer\DataService.asmx.cs:line 48 

He escrito esta pregunta al autor del artículo, pero desde su última respuesta fue en marzo de 2012, no estoy seguro de si responderá. Si alguien pudiera ayudarme con este problema, estaría muy agradecido.

PD: Al exportar el certificado de .cer a .pfx, he cambiado el título del archivo exportado. Aunque dudo que su efecto sobre el problema, prefiero mencionarlo.

¿Configuró lo siguiente en el grupo de aplicaciones en IIS?

  1. Ir al Administrador de IIS
  2. Ir a la instancia del grupo de aplicaciones
  3. Haga clic en la configuración avanzada
  4. En Modelo de proceso, establezca Cargar perfil de usuario en verdadero

Vea esta pregunta de la stack para leer más: ¿Qué sucede exactamente cuando configuro LoadUserProfile del grupo IIS?

Debido a que esta pregunta tiene un alto rango de búsqueda, me gustaría presentar una forma de presentar X509Certificate2 con una ruta absoluta (que solo acepta) a un archivo de clave pxf relativamente ubicado en una aplicación ASP.net.

  string path = HttpContext.Current.Server.MapPath("~") + "..\keys\relative_key.pfx"; X509Certificate2 cert = new X509Certificate2(path, "", X509KeyStorageFlags.DefaultKeySet); 

Al pasar CspParameters con el indicador csdMachineKeyKeyStore, IIS puede omitir la restricción que produce la excepción.

 CspParameters cspParams = new CspParameters(); cspParams.KeyContainerName = Guid.NewGuid().ToString().ToUpperInvariant(); cspParams.Flags = CspProviderFlags.UseMachineKeyStore; RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(cspParams); 

Encontré la solución aquí:

Enlace al recurso de información

Para aquellos de ustedes que recibieron la excepción criptográfica cuando intentaron importar un certificado X509 con el método de importación, descubrí que el uso de la opción Enum para MachineKeySet omitió la necesidad de crear un usuario de contexto en IIS y, por lo tanto, es más fácil de implementar.

 X509Certificate2 cert = new X509Certificate2(); cert.Import(certificateFilePath, certPasshrase, X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet);