ejemplo - rsa c#
El objeto ya existe en RSACryptoServiceProvider (4)
¿Intentó otorgar permisos a Todos, por ejemplo, para los archivos en "Documentos y configuración / Todos los usuarios / Datos de la aplicación / Microsoft / Crypto / RSA / Machine Keys", como se describe allí:
http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/f7b9f928-a794-47f2-a5bd-9f64ca375040
Copié el código fuente de una aplicación a otra, ambas corriendo en la misma máquina. También estoy usando la misma cadena para containerName a continuación en ambas aplicaciones.
¿Qué impide que mi nueva aplicación lea la clave que se guardó en la otra aplicación? Todas las demás cosas son iguales, cuenta de usuario registrada, etc.
CspParameters cspParams = new CspParameters();
cspParams.KeyContainerName = containerName;
cspParams.Flags = CspProviderFlags.UseMachineKeyStore;
// Get error "object already exists" below.
RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);
Me encontré con este problema porque mi servicio WCF no tenía permiso para acceder al almacén de claves. Pasé el problema siguiendo las instrucciones para otorgarle al usuario acceso de lectura ASPNET que encontré aquí: http://msdn.microsoft.com/en-us/library/2w117ede.aspx#Y898
Otra solución es establecer el acceso a todos por código:
CspParameters cspParams;
cspParams = new CspParameters(PROVIDER_RSA_FULL);
cspParams.KeyContainerName = CONTAINER_NAME;
cspParams.Flags = CspProviderFlags.UseMachineKeyStore;
cspParams.ProviderName = "Microsoft Strong Cryptographic Provider";
CryptoKeyAccessRule rule = new CryptoKeyAccessRule("everyone", CryptoKeyRights.FullControl, AccessControlType.Allow);
cspParams.CryptoKeySecurity = new CryptoKeySecurity();
cspParams.CryptoKeySecurity.SetAccessRule(rule);
Recientemente me encontré con este problema con varios sitios IIS implementados en un solo servidor (Windows 2008 R2). Nuestro entorno tiene cada sitio ejecutándose en diferentes grupos de aplicaciones, pero en algunos casos, a esos grupos se les puede asignar la misma identidad.
Nuestra aplicación crea una clave si no existe, y la coloca en un contenedor con un nombre basado en la identidad actual. El primer sitio implementado siempre funcionó, pero si desplegáramos otro sitio en otro grupo de aplicaciones con la misma identidad, el segundo fallaría.
Resulta que cuando se almacena la clave, Windows da acceso completo al usuario "IIS APPPOOL / AppPoolName", y no la identidad que hemos asignado al grupo.
Por lo tanto, nuestra solución era otorgar al contenedor permisos explícitos para la identidad actual (esto es similar a la respuesta de @Webmixer, la única diferencia está en CryptoKeyAccessRule
):
CspParameters cspParams;
cspParams = new CspParameters(PROVIDER_RSA_FULL);
cspParams.KeyContainerName = CONTAINER_NAME;
cspParams.Flags = CspProviderFlags.UseMachineKeyStore;
cspParams.ProviderName = "Microsoft Strong Cryptographic Provider";
CryptoKeyAccessRule rule = new CryptoKeyAccessRule(System.Security.Principal.WindowsIdentity.GetCurrent(), CryptoKeyRights.FullControl, AccessControlType.Allow);
cspParams.CryptoKeySecurity = new CryptoKeySecurity();
cspParams.CryptoKeySecurity.SetAccessRule(rule);