Encriptando los ficheros de configuración…

Un aspecto a tener en cuenta en el despliegue de las aplicaciones cuando las ponemos en producción es la encriptación de las secciones que puedan contener datos sensibles.


Con .NET 2.0 se pueden encriptar secciones del fichero Web.Config con la utilidad de línea de comandos «aspnet_regiis.exe«. Por defecto, el framework 2.0 viene con dos proveedores para realizar la encriptación: RSAProtectedConfigurationProvider y DPAPIProtectedConfigurationProvider.


La encriptación del fichero de configuración es transparente para la aplicación, por lo que no habrá que cambiar nada en ésta después de encriptar las secciones que nos interesen.


Por ejemplo, para encriptar las cadenas de conexión del fichero WebConfig la línea de comandos sería algo así.



aspnet_regiis -pe «connectionStrings» -app «/IISVirtualDir»


La utilidad aspnet_regiis la podéis encontrar en :



%WINDIR%Microsoft.NETFrameworkv2.0.50727


Uno de los problemas que le veo a la utilidad, es que no viene preparada para encriptar secciones de los ficheros App.Config. La utilidad aspnet_regiis buscar siempre el fichero Web.Config por lo que a priori no encripta los ficheros App.Config.


Realmente si renombrais el fichero App.Config por Web.Config podréis encriptarlo sin problemas, pero me parece un poco cutre.


En mi caso, ante la necesidad de encriptar tanto ficheros Web.Config como App.Config, he optado por hacerme una utilidad para realizar esta operación y no usar la que nos proporciona el framework…aspnet_regiis.


El código necesario para realizar esta operación es muy sencillo..



string provider = «RsaProtectedConfigurationProvider«;


Configuration config = ConfigurationManager.OpenExeConfiguration(configPath);


ConfigurationSection section = config.GetSection(«connectionStrings«);



if (section != null & !section.SectionInformation.IsProtected)
{
      section.SectionInformation.ProtectSection(provider);
      section.SectionInformation.ForceSave = true;
      config.Save(ConfigurationSaveMode.Modified);
}


Si se quiere descomprimir lo único que habría que hacer es llamar a UnprotectSection en lugar de a ProtectSection.


Y si queremos que esta utilidad valga también para ficheros Web.Config, el código sería exactamente el mismo pero usando WebConfigurationManager.OpenWebConfiguration para abrir el fichero de configuración.


Espero que os sea de utilidad..


La información completa sobre cómo encriptar y desencriptar la podéis encontrar en los siguientes enlaces:



Cómo: Cifrar secciones de configuración en ASP.NET 2.0 mediante RSA



Cómo: Cifrar secciones de configuración en ASP.NET 2.0 mediante DAPI

Ibon Landa

bon Landa lleva más de 15 años dedicado al desarrollo de software. Durante este tiempo ha trabajado en diferentes empresas en las cuáles ha podido trabajar en diferentes entornos y tecnologías. Actualmente está focalizado principalmente en tareas de desarrollo, arquitectura, en las herramientas del ciclo de vida y en todo lo relacionado con la plataforma de Cloud Computing Microsoft Azure, área en el que ha sido reconocido como MVP. Participa de forma activa en la comunidad, escribiendo su blog, manteniendo un portal sobre Microsoft Azure y colaborando con Microsoft y grupos de usuarios en eventos de formación, talleres y giras de producto.

15 comentarios en “Encriptando los ficheros de configuración…”

  1. Hola:

    Que clase tengo que importar para que me permita utilizar
    Configuration config = ConfigurationManager.OpenExeConfiguration

    Utilizo una aplicacion de escritorio
    Urgue

  2. Tiene que usar System.Configuration y System.Web.Configuration si quieres usar OpenWebConfiguration.

    Si no las tienes, tendrás que añadir tb las referencias al proyecto, no sólo hacer el using.

  3. Gracias, y esta parte de configPath
    la utiliza en :
    Configuration config = ConfigurationManager.OpenExeConfiguration(configPath);

    pero esa variable de que contiene??

    Gracias

  4. Aqui coloco el codigo pero no veo que se encripte algo tengo mal? Y solo entra una vez al
    if (section !… si lo ejecuto por segunda ocasion ya no entra xq

    public void EncriptarAppConfig()
    {
    try
    {
    string provider = «RsaProtectedConfigurationProvider»;

    Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath);

    ConfigurationSection section = config.GetSection(«connectionStrings»);

    if (section != null & !section.SectionInformation.IsProtected)
    {
    section.SectionInformation.ProtectSection(provider);
    section.SectionInformation.ForceSave = true;
    config.Save(ConfigurationSaveMode.Modified);
    }

    }
    catch { }
    }

  5. configPath es la ruta completa al fichero ejecutable, por ejemplo, «c:MiEjecutable.exe».

    El código que pones es correcto y si después de ejecutarlo una vez después no te entra, es porque ya está encriptada.

    Ten en cuenta, que si lo estás probando desde visual studio en modo depuración, no te encripta el fichero App.Config que tienes incluido en el proyecto, te encripta el fichero config que está junto con el ejecutable….MiEjecutable.config…Por ejemplo, si lo estás depurando estará en el fichero Debug.

    He copia el código en una aplicación WinForm y sí que me encripta correctamente la sección. Prueba a ver y me dices.

  6. No se si te ha pasado pero me sale un error como el siguiente «acceso denegado al archivo ruta/web.config», he tratado de configurar las opciones del IIS pero no encuentro exactamente donde debo modificarle.

    Si tienes idea de que pordria ser lo que esta pasando, te agradeceria inmensamente (nuevamente…)

  7. Revisa los permisos que tienes en el directorio/ficheros del proyecto, los permisos a nivel de windows.
    Para asegurarte y descartar esta opción da permisos a todos de lectura/escritura al fichero. Si con esto funciona, será que tienes que dar permisos de lectura al usuario con el que te logeas en el IIS de forma anónima.

  8. Hola quisiera saber la forma de encriptar un app Config cuando mi app Config manda llamar a un webService, porque ya intente con tu programa y me encripta el webConfig del webService que mando llamar en mi appConfig.

  9. Me parecio muy interestante este post. Mi consulta es la siguiente: ¿esta misma utilidad se puede aplicar tambien a aplicaciones desarrolladas con VS.NET 2003 (Frm 1.1) ?

  10. Pude utilizar como dices el aspnet_regiis como para encriptar un web.config.
    Por lo que leí en otros docs esto solo tiene sentido cuando se termina instalando el site en la misma máquina donde se corre la encriptación.
    ¿Es correcto esto?

    Siendo así, como podría encriptar el web.config para luego subirlo a otro servidor y que siga funcionando todo bien?….

    A esto te sumo la siguiente restricción:
    Estoy utilizando el Enterprise Library Data Access Block y debo acceder al connection string de una base a través de esta instrucción:
    Database db = DatabaseFactory.CreateDatabase(«myInstanceName»);

    Por lo que no puedo realizar la encriptación y desencriptación manual del connectionString 🙁

    Como podría solucionar esto?

    Muchas gracias!!

  11. Hola Cristia,

    La encriptación del fichero de configuración no afecta para nada a la aplicación, por lo que tendrías que poder utilizar la Enterprise Library sin problemas.

    Por otro lado, lo normal es desplegar la aplicación y luego encriptar en el servidor. De esta manera si alguien te roba el fichero no podrá desencriptarlo.

    De todas manera en el enlace de la MSDN se explica como encriptar en una máquina y luego llevar el mismo web.config a otra, situación habitual cuando se tiene la aplicación desplegada en una batería de IIS.

    Un saludo,

  12. Utilice la porción de código para encriptar el app.config pero despues que instale Windows 7 y registraron la laptop en el dominio de la compañia esta generando una excepción en la instrucción: config.Save(ConfigurationSaveMode.Modified);

    La excepción es de tipo ConfigurationErrorsException y el mensaje: «An error occurred executing the configuration section handler for connectionStrings.»

    PD: El provider utilizado es «RsaProtectedConfigurationProvider».

    ¿Que podrá ser?

  13. Solo una pregunta. Soy nuevo en esto del .Net y no me reconoce el path del ejecutable y me indica que la ruta … no es una ruta de acceso virtual válida.

    ¿de que manera puedo solventar este inconveniente?

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *