“Ocurrió un error interno” al cargar el archivo pfx con X509Certificate2

Estoy intentando usar certificado autofirmado (c #):

X509Certificate2 cert = new X509Certificate2( Server.MapPath("~/App_Data/myhost.pfx"), "pass"); 

en un servidor de alojamiento web compartido y recibí un error:

 System.Security.Cryptography.CryptographicException: An internal error occurred. 

la traza de stack termina con

 System.Security.Cryptography.CryptographicException. ThrowCryptogaphicException(Int32 hr) +33 System.Security.Cryptography.X509Certificates.X509Utils. _LoadCertFromFile(String fileName, IntPtr password, UInt32 dwFlags, Boolean persistKeySet, SafeCertContextHandle& pCertCtx) +0 System.Security.Cryptography.X509Certificates.X509Certificate. LoadCertificateFromFile(String fileName, Object password, X509KeyStorageFlags keyStorageFlags) +237 System.Security.Cryptography.X509Certificates.X509Certificate2..ctor( String fileName, String password) +131 

En mi máquina de desarrollo, carga bien. El motivo por el que cargo * .pfx no es un archivo * .cer porque necesito un acceso a la clave privada (el archivo cer carga Ok). Hice pfx en mi dev mochine así:

 makecert -r -n "CN=myhost.com, E=admin@myhost.com" -sky exchange -b 01/01/2009 -pe -sv myhost.pvk myhost.cer pvk2pfx -pvk myhost.pvk -spc myhost.cer -pfx myhost.pfx -po pass 

Estoy usando la versión v5.131.3790.0 de makecert

Use la tienda de informática local para obtener la clave privada:

 X509Certificate2 cert = new X509Certificate2("myhost.pfx", "pass", X509KeyStorageFlags.MachineKeySet); 

MachineKeySet se describe como “las claves privadas se almacenan en la tienda de informática local en lugar de la tienda de usuario actual”. El valor predeterminado sin marcas es colocar en la tienda del usuario.

Aunque está leyendo el certificado del disco y almacenándolo en un objeto, las claves privadas aún se almacenan en la base de datos de claves del proveedor de servicios criptográficos de la API de cifrado de Microsoft. En el servidor de alojamiento, el proceso ASP.NET no tiene permiso para acceder al almacén de usuarios.

Otro enfoque (según algunos comentarios a continuación) es modificar la configuración de IIS o la identidad del conjunto de aplicaciones, que funcionan. Sin embargo, esto supone que hay acceso a estos elementos de configuración que pueden no ser el caso (por ejemplo, en un entorno de alojamiento compartido).

Intenté la solución de Randy de cambiarlo a MachineKeySet, pero luego recibí el mensaje de error:

“clave no válida para uso en estado especificado”

Entonces, después de hacer un poco de búsqueda de Google, encontré una publicación que sugería cambiarla a:

 var certificate = new X509Certificate2(certKeyFilePath, passCode, X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet ); 

y esto solucionó mis problemas.

Aún no he intentado con la sugerencia de cambiar la configuración del grupo de aplicaciones de configuración en la configuración de IIS. Para hacer esto, vaya a Configuración avanzada para el grupo de aplicaciones de su sitio y configure “cargar perfil de usuario” en verdadero. Cuando esta configuración es falsa, aparentemente no se puede acceder a los contenedores de claves.