2009-08-28 36 views
70

Estoy intentando utilizar el certificado autofirmado (C#):"Ha ocurrido un error interno". al cargar el archivo PFX con X509Certificate2

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. 

extremos seguimiento de la pila 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 una clave privada (el archivo cer carga Ok). hice pfj en mi dev mochine así:

makecert -r -n "CN=myhost.com, [email protected]" -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> 

estoy usando la versión v5.131.3790.0 de makecert

+0

Quizás este artículo puede ayudar: http://www.codeproject.com/KB/WCF/wcfcertificates.aspx – Emmanuel

+0

Recibía el mensaje de error 'el sistema no puede encontrar el archivo especificado'. ¡La respuesta de @Randy Levy funcionó para mí! – Jess

Respuesta

136

utilizar el almacén de equipo local para 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) consiste en 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).

+3

sí, ayuda, gracias. ¿podrías explicar por qué? docs no dice nada útil. –

+2

Me salvaste el día. Curiosamente, funcionó en mi máquina antes de actualizar la solución a .NET 4.0 –

+1

De hecho, todo lo que se necesitaba era configurar el parámetro X509KeyStorageFlags.MachineKeySet. Es realmente triste que la excepción lanzada simplemente indique "Se produjo un error interno". No muy útil. – Nicholi

8

me trataron solución de Randy de cambiarlo a MachineKeySet, pero luego recibieron 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ó cambiarlo a:

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

y esto resolvió 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.

+0

Recibí el error mencionado anteriormente y su solución ha ayudado a resolverlo. gracias. – mohang

Cuestiones relacionadas