“Se ha producido un error interno.” Al cargar el archivo PFX con X509Certificate2

StackOverflow https://stackoverflow.com/questions/1345262

  •  20-09-2019
  •  | 
  •  

Pregunta

uso

Estoy intentando certificado autofirmado (c #):

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

en un servidor de alojamiento web compartido y me dio un error:

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

seguimiento de la pila 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 dev se carga bien. La razón por la que la carga no un archivo * .pfx * .cer porque necesito una clave de acceso privado (carga el archivo CER Ok). Hice pfj 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
<b>pvk2pfx</b> -pvk myhost.pvk -spc myhost.cer -pfx myhost.pfx -po pass</code>
Versión

Estoy utilizando v5.131.3790.0 de makecert

¿Fue útil?

Solución

Utilice la tienda local de computadoras para la clave privada:

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

MachineKeySet se describe como "claves privadas se almacenan en el almacén del equipo local en lugar de la tienda de usuario actual". El valor por defecto sin banderas es colocar en el almacén del usuario.

A pesar de que usted está leyendo el certificado de disco y almacenarlo en un objeto aún las claves privadas se almacenan en la base de datos del proveedor clave de cifrado de Microsoft API de servicios de cifrado. En el servidor que aloja el proceso de 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 de grupo de aplicaciones - que hacen el trabajo. Sin embargo, esto supone que hay acceso a estos elementos de configuración que puede no ser el caso (por ejemplo, en un entorno de alojamiento compartido).

Otros consejos

He intentado la solución de Randy de cambiarlo a MachineKeySet, pero luego dieron el mensaje de error:

"clave no válida para su uso en estado"

Así que después de un poco de googling alrededor me encontré con un post que sugirió cambiar a:

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

y esto solucionó mis problemas.

Todavía no he probado la sugerencia de cambiar la configuración de grupo de aplicación de ajuste en la configuración de IIS. Para ello, accede a la configuración avanzada de grupo de aplicación de su sitio a continuación, "perfil de usuario de carga" true. Cuando este valor es falso, los contenedores de claves no son accesibles al parecer.

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