2009-07-09 64 views
14

Tengo una aplicación que está utilizando RSACryptoServiceProvider para descifrar algunos datos utilizando una clave privada conocida (almacenada en una variable).RSACryptoServiceProvider El sistema CryptographicException no puede encontrar el archivo especificado en ASP.NET

Cuando el grupo de aplicaciones IIS está configurado para usar el servicio de red, todo funciona bien.

Sin embargo, al configurar el grupo de aplicaciones IIS para ejecutar el código con una identidad diferente, obtenemos lo siguiente:

System.Security.Cryptography.CryptographicException: The system cannot find the file specified. 

    at System.Security.Cryptography.Utils.CreateProvHandle(CspParameters parameters, Boolean randomKeyContainer) 
    at System.Security.Cryptography.RSACryptoServiceProvider.ImportParameters(RSAParameters parameters) 
    at System.Security.Cryptography.RSA.FromXmlString(String xmlString) 

El código es algo como esto:

byte[] input; 
byte[] output; 
string private_key_xml; 

var provider = new System.Cryptography.RSACryptoServiceProvider(this.m_key.Key_Size); 
provider.FromXmlString(private_key_xml); // Fails Here when Application Pool Identity != Network Service 

ouput = provider.Decrypt(input, false); // False = Use PKCS#1 v1.5 Padding 

Hay recursos que intentan responder estableciendo que debe otorgar al usuario acceso de lectura al almacén de claves de la máquina; sin embargo, no hay una respuesta definitiva para resolver este problema.

Medio Ambiente: IIS 6.0, Windows Server 2003 R2, .NET 3.5 SP1

Respuesta

9

hecho lo necesario para trabajar un código como este

CspParameters _cpsParameter; 
RSACryptoServiceProvider RSAProvider; 

_cpsParameter = new CspParameters(); 
_cpsParameter.Flags = CspProviderFlags.UseMachineKeyStore; 

RSAProvider = new RSACryptoServiceProvider(1024, _cpsParameter); 

Los siguientes usuarios necesitan tener acceso a la carpeta: C: \ Documents and Settings \ All Users \ Datos de programa \ Microsoft \ Crypto \ RSA \ MachineKeys

  1. cuenta de usuario de IIS (anonymmous)
  2. La cuenta de usuario que utiliza para hacerse pasar por su aplicación en la configuración web.config.

Así que ahora está funcionando bien para mí.

+0

Gracias por la respuesta. No he tenido la oportunidad de probar esto todavía. ¿Sabes si las cuentas nuevas de forma predeterminada (instalación de Windows limpia) ya tienen acceso a esto? Estamos tratando de evitar tener que modificar demasiado, y esto parece ser un problema particularmente extraño para algo que debe ejecutarse bajo una confianza baja/media. –

+0

Will, no estoy seguro! Este problema en particular le sucedió solo a mi máquina. Intenté con otra máquina desarrolladora y las cosas funcionan como se suponía. En el servidor, nuestros sistemas se ejecutan en un contexto de usuario diferente, por lo que no tuve ningún problema. –

8

Inténtelo de

System.Security.Cryptography.RSACryptoServiceProvider.UseMachineKeyStore = true; 

EDIT: volver a intentar usar

var provider = new System.Security.Cryptography.RSACryptoServiceProvider(); 

en lugar del constructor con el entero-parámetro. Ese constructor intenta generar una clave con la longitud de clave especificada, y es posible que no pueda hacer eso con sus permisos.

+0

no cambió nada. –

+0

Esto funcionó para mí en IIS7 con la identidad predeterminada del conjunto de aplicaciones. –

+2

Parece que también se puede llamar "RSACryptoServiceProvider nuevos (nuevos CspParameters {Banderas = CspProviderFlags.UseMachineKeyStore})" si no desea habilitar el parámetro de manera global. –

28

Lo solucioné configurando "Cargar perfil de usuario" en Verdadero (era falso) en la sección Configuración avanzada/Modelo de proceso del conjunto de aplicaciones.

La aplicación ha estado funcionando perfectamente en Server 2003 R2/IIS 6 y el problema apareció cuando lo estaba configurando en nuestro nuevo servidor 2008 R2.

tuvo la idea de probarlo en:

http://social.msdn.microsoft.com/forums/en-US/clr/thread/7ea48fd0-8d6b-43ed-b272-1a0249ae490f/

YMMV

+1

Eso funcionó para mí, gracias! :) –

+0

Esto se debe a que las claves se almacenan en DPAPI http://security.stackexchange.com/q/1771/396 – LamonteCristo

+0

Gracias, funcionó para mí en el servidor, pero no localmente, deambulo por qué. He leído que esta función intenta acceder al almacén de claves y falla debido a los permisos, aunque el código no necesita el almacén de claves. –

1

solo quería comentar que la solución de Rasmus Faber trabajó para mí (con una edición menor):

System.Cryptography.RSACryptoServiceProvider.UseMachineKeyStore = true; 
RSACryptoServiceProvider provider = new System.Cryptography.RSACryptoServiceProvider(); 

Estaba tratando de obtener MailBee.net para firmar un mensaje saliente usando DKIM y recibió el mismo mensaje que recibió el OP. Por supuesto, todo estaba bien en mi máquina de desarrollo, pero al subir a mis clientes, me encontré con este problema. Como dije, la solución anterior funcionó para mí, mientras que otras que encontré en línea (incluido el enlace al foro msdn anterior) no me funcionaron.

(Me upvote y comentar, pero no tengo representante suficiente para hacerlo:. P)

Gracias Rasmus Faber!

Cuestiones relacionadas