¿Le resultó útil esta página?
Sus comentarios sobre este contenido son muy importantes. Háganos saber su opinión.
¿Tiene comentarios adicionales?
Caracteres restantes: 1500
MSDN Library

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

Julio de 2005

Publicado: 21 de Diciembre de 2005

patterns & practices Developer Center (en inglés)

J.D. Meier, Alex Mackman, Blaine Wastell, Prashant Bansode, Andy Wigley
Microsoft Corporation

Este artículo se aplica a:
ASP.NET versión 2.0
Sistema operativo Microsoft ® Windows Server®2003

Resumen: En este artículo se muestra cómo utilizar el proveedor de configuración protegida RSA y la herramienta Aspnet_regiis.exe para cifrar secciones de los archivos de configuración. Puede utilizar la herramienta Aspnet_regiis.exe para cifrar datos confidenciales, como cadenas de conexión, en los archivos Web.config y Machine.config. Puede exportar e importar fácilmente claves de RSA de servidor a servidor. Esto hace que el cifrado RSA sea particularmente eficaz a la hora de cifrar archivos de configuración utilizados en varios servidores de una batería de servidores Web.

En esta página

Objetivos Objetivos
Descripción general Descripción general
Novedades de la versión 2.0 Novedades de la versión 2.0
Resumen de los pasos Resumen de los pasos
Paso 1. Identificación de las secciones de configuración que se van a cifrar Paso 1. Identificación de las secciones de configuración que se van a cifrar
Paso 2. Elección de contenedores en el nivel de equipo o en el nivel de usuario Paso 2. Elección de contenedores en el nivel de equipo o en el nivel de usuario
Paso 3. Cifrado de los datos del archivo de configuración Paso 3. Cifrado de los datos del archivo de configuración
Escenarios de baterías de servidores Web Escenarios de baterías de servidores Web
Recursos adicionales Recursos adicionales
Comentarios Comentarios
Soporte técnico Soporte técnico
Comunidad y grupos de noticias Comunidad y grupos de noticias
Colaboradores y revisores Colaboradores y revisores

Objetivos

  • Aprender los cambios clave para cifrar datos confidenciales en archivos de configuración de la versión 2.0 de ASP.NET.

  • Aprender a elegir entre contenedores en el nivel de equipo y en el nivel de usuario.

  • Utilizar el proveedor de configuración protegida RSA para cifrar cadenas de conexión

  • Crear contenedores de claves de RSA.

  • Importar y exportar claves de RSA a través de varios servidores de una batería de servidores Web.

Descripción general

Los archivos de configuración, como el archivo Web.config suelen utilizarse para guardar información confidencial, como nombres de usuario, contraseñas, cadenas de conexión de bases de datos y claves de cifrado. Las secciones que normalmente contienen información confidencial que debe cifrarse son las siguientes:

  • <appSettings>. Esta sección contiene la configuración personalizada de las aplicaciones.

  • <connectionStrings>. Esta sección contiene las cadenas de conexión.

  • <identity>. Esta sección puede contener credenciales de representación.

  • <sessionState>. Esta sección contiene la cadena de conexión para el proveedor de estado de sesión fuera de proceso.

El cifrado y descifrado de datos incide en el rendimiento. Para que la incidencia sea mínima, cifre sólo las secciones del archivo de configuración que almacenen datos confidenciales.

Novedades de la versión 2.0

Las versiones 1.0 y 1.1 de .NET Framework tenían una compatibilidad limitada con el cifrado de archivos de configuración. No obstante, la versión 2.0 de .NET Framework introduce una característica de configuración protegida que puede utilizarse para cifrar datos de archivos de configuración confidenciales mediante una herramienta de línea de comandos. Se proporcionan los dos siguientes proveedores de configuración protegida, aunque también puede implementar proveedores personalizados.

  • RSAProtectedConfigurationProvider. Éste es el proveedor predeterminado y utiliza el cifrado de clave pública RSA para cifrar y descifrar datos.

  • DPAPIProtectedConfigurationProvider. Este proveedor utiliza la protección de datos API de Windows (DPAPI) para cifrar y descifrar datos.

En este artículo se explica cómo utilizar la herramienta Aspnet_regiis.exe junto con RSAProtectedConfigurationProvider para cifrar secciones del archivo de configuración. Este proveedor utiliza el cifrado de clave pública RSA.

Nota

ASP.NET descifra de forma automática secciones de configuración cuando las procesa, por tanto, no es necesario escribir códigos de descifrado adicionales.

Resumen de los pasos

Para cifrar secciones de configuración mediante el proveedor de configuración protegida, realice los siguientes pasos:

  • Paso 1. Identificación de las secciones de configuración que se van a cifrar.

  • Paso 2. Elección de contenedores en el nivel de equipo o en el nivel de usuario

  • Paso 3. Cifrado de datos de archivos de configuración.

Paso 1. Identificación de las secciones de configuración que se van a cifrar

El cifrado y descifrado de datos incide en el rendimiento. Para que la incidencia sea mínima, cifre sólo las secciones del archivo de configuración que almacenen datos confidenciales.

Secciones que no se pueden cifrar mediante la configuración protegida

Si almacena datos confidenciales en cualquiera de las siguientes secciones de configuración, no podrá cifrarlos mediante un proveedor de configuración protegida y la herramienta Aspnet_regiis.exe:

  • <processModel>

  • <runtime>

  • <mscorlib>

  • <startup>

  • <system.runtime.remoting>

  • <configProtectedData>

  • <satelliteassemblies>

  • <cryptographySettings>

  • <cryptoNameMapping>

  • <cryptoClasses>

En el caso de las secciones de configuración que se muestran, se recomienda utilizar la herramienta Aspnet_setreg.exe, que también está disponible en versiones anteriores de .NET Framework.

Para obtener más información acerca del uso de la herramienta Aspnet_setreg para cifrar datos en estas secciones de configuración, consulte el artículo 329290 de Microsoft Knowledge Base, How to use the ASP.NET utility to encrypt credentials and session state connection strings (en inglés).

Paso 2. Elección de contenedores en el nivel de equipo o en el nivel de usuario

RSAProtectedConfigurationProvider permite el uso de contenedores de claves en el nivel de equipo y en el nivel de usuario para el almacenamiento de claves. Los contenedores de claves en el nivel de equipo están disponibles para todos los usuarios, pero un contenedor de claves en el nivel de usuario sólo estará disponible para ese usuario.

La elección del contenedor depende en gran medida de si la aplicación comparte, o no, un servidor con otras aplicaciones y si deben conservarse en privado, o no, los datos confidenciales de cada aplicación.

Contenedor de claves de equipo

Utilice un contenedor de claves en el nivel de equipo en las siguientes situaciones:

  • La aplicación se ejecuta en su propio servidor sin otras aplicaciones.

  • Tiene varias aplicaciones en el mismo servidor y desea que esas aplicaciones puedan compartir información confidencial y la misma clave de cifrado.

Los contenedores de claves RSA de equipo se almacenan en la siguiente carpeta:

\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys

Contenedor de claves de usuario

Utilice un contenedor de claves en el nivel de usuario si ejecuta la aplicación en un entorno de alojamiento compartido y desea asegurarse de que las demás aplicaciones del servidor no pueden tener acceso a los datos confidenciales de la aplicación. En este caso, cada aplicación debería tener una identidad independiente y los recursos de la aplicación (como archivos y bases de datos) deberían estar restringidos a esa identidad.

Los contenedores de claves RSA de usuario se almacenan en la siguiente carpeta:

\Documents and Settings\{NombreUsuario}\Application Data\Microsoft\Crypto\RSA

Paso 3. Cifrado de los datos del archivo de configuración

En este paso se muestra cómo cifrar una cadena de conexión en el archivo Web.config. Primero se muestra cómo hacerlo con el almacén del equipo y, a continuación, con el del usuario.

Uso de RSA con contenedores de claves en el nivel de equipo para cifrar cadenas de conexión en Web.Config

RSAProtectedConfigurationProvider es el proveedor predeterminado y está configurado para utilizar el contenedor en el nivel de equipo.

Para cifrar la sección connectionStrings del archivo Web.config

  1. Cree un nuevo sitio Web llamado MachineRSA. Asegúrese de que este directorio esté configurado como directorio virtual.

  2. Agregue un archivo de configuración Web.config a este directorio.

  3. Agregue una sección connectionString de muestra parecido al siguiente ejemplo:

    <connectionStrings>
      <add name="MyLocalSQLServer" 
           connectionString="Initial Catalog=aspnetdb;
           data source=localhost;Integrated Security=SSPI;" 
           providerName="System.Data.SqlClient"/>
    </connectionStrings>
    
  4. Ejecute el siguiente comando desde un símbolo del sistema de .NET para cifrar la sección connectionStrings:

    aspnet_regiis -pe "connectionStrings" -app "/MachineRSA"

    El comando anterior, con el modificador -app, asume que hay un directorio virtual IIS llamado MachineRSA. Si está utilizando el servidor Web de Visual Studio .NET 2005 en lugar de IIS, utilice el modificador -pef, que permite especificar la ubicación física del directorio del archivo de configuración.

    aspnet_regiis.exe -pef "connectionStrings" C:\Projects\MachineRSA

    Nota La herramienta Aspnet_regiis.exe está en el siguiente directorio:

    %WinDir%\Microsoft.NET\Framework\<númeroVersión>
    
    • El modificador -pe especifica la sección de configuración que se va a cifrar. Éste es el nombre de elemento XML de la sección de configuración

      En el caso de elementos anidados, como la sección <pages> que está dentro de <system.web>, el nombre XML tiene que incluir los grupos de sección que contiene; por ejemplo: "system.web/pages".

    • El modificador -pef especifica la sección de configuración que se va a cifrar y permite proporcionar la ruta del directorio físico para el archivo de configuración.

    • El modificador -app especifica la ruta virtual de la aplicación Web. En el caso de ser una aplicación anidada, es necesario especificar la ruta anidada desde el directorio raíz; por ejemplo, "/test/aspnet/MachineRSA".

    • Ya que está utilizando el proveedor predeterminado con valores predeterminados, no necesita utilizar el modificador -prov, el cual especifica el nombre del proveedor.

    Si el comando funciona correctamente, verá el siguiente resultado:

    Encrypting configuration section...
    Succeeded!
    

    Nota Los contenedores de claves RSA de equipo se almacenan en la siguiente carpeta:

    \Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys
    
  5. Revise el archivo Web.config y examine los cambios. Se han creado los siguientes elementos:

    • <EncryptedData>

    • <EncryptionMethod>

    • <KeyInfo>

    • <EncryptedKey>

    • <KeyName>

    • <CipherData>

    • <CipherValue>

    El archivo Web.Config modificado, con la sección connectionStrings cifrada, debería ser similar al siguiente ejemplo:

    ...
    <connectionStrings configProtectionProvider="RsaProtectedConfigurationProvider">
        <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"
          xmlns="http://www.w3.org/2001/04/xmlenc#">
          <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
          <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
            <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
              <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
              <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
                <KeyName>Rsa Key</KeyName>
              </KeyInfo>
              <CipherData>
    		  
                <CipherValue>R7cyuRk+SXJoimz7wlOpJr/YLeADGnwJVcmElHbrG/B5dDTE4C9
    			rzSmmTsbJ9Xcl2oDQt1qYma9L7pzQsQQYqLrkajqJ4i6ZQH1cmiot8ja7Vh+yItes7TRU
    			1AoXN9T0mbX5H1Axm0O3X/285/MdXXTUlPkDMAZXmzNVeEJHSCE=</CipherValue>
    			
              </CipherData>
            </EncryptedKey>
          </KeyInfo>
          <CipherData>
    	  
            <CipherValue>d2++QtjcVwIkJLsye+dNJbCveORxeWiVSJIbcQQqAFofhay1wMci8FFlb
    		QWttiRYFcvxrmVfNSxoZV8GjfPtppiodhOzQZ+0/QIFiU9Cifqh/T/7JyFkFSn13bTKjbYmHObKA
    		zZ+Eg6gCXBxsVErzH9GRphlsz5ru1BytFYxo/lUGRvZfpLHLYWRuFyLXnxNoAGfL1mpQM7M46x5Y
    		WRMsNsNEKTo/PU9/Jvnh/lT+GlcgCs2JRpyzSfKE7zSJH+TpIRtd86PwQ5HG3Pd2frYdYw0rmlml
    		I9D</CipherValue>
    		
          </CipherData>
        </EncryptedData>
      </connectionStrings>
    ...
    
  6. Agregue la siguiente página Web Default.aspx al directorio virtual de la aplicación y, a continuación, desplácese hasta esta página para comprobar que el cifrado y el descifrado funcionan correctamente.

    <%@ Page Language="C#" %>
    
    <script runat="server">
        protected void Page_Load(object sender, EventArgs e)
        {
            Response.Write("Clear text connection string is: " + 
                     ConfigurationManager.ConnectionStrings
                                ["MyLocalSQLServer"].ConnectionString);
        }
    </script>
    <html>
      <body/>
    </html>
    

    MyLocalSQLServer es el nombre de la cadena de conexión que ha especificado previamente en el archivo Web.config.

    Nota Si la identidad de la aplicación ASP.NET no tiene acceso al almacén de la clave de configuración de .NET Framework, se devolverá el siguiente mensaje:

    Parser Error Message: Failed to decrypt using provider 'RsaProtectedConfigurationProvider'.
     Error message from the provider: The handle is invalid.
    

    Para conceder acceso a la identidad de la aplicación ASP.NET

    a/ Si no está seguro de qué identidad utilizar, compruebe la identidad desde una página Web utilizando el siguiente código:

    using System.Security.Principal;
    ...
    protected void Page_Load(object sender, EventArgs e)
    {
      Response.Write(WindowsIdentity.GetCurrent().Name);
    }
    

    b/ De forma predeterminada, las aplicaciones ASP.NET de Windows Server 2003 se ejecutan utilizando la cuenta NT Authority\Servicio de red. Abra un símbolo del sistema .NET y utilice el siguiente comando para dar a esta cuenta acceso al almacén NetFrameworkConfigurationKey:

    aspnet_regiis -pa "NetFrameworkConfigurationKey" "NT Authority\Servicio de red"

    Si el comando funciona correctamente, verá el siguiente resultado:

    Adding ACL for access to the RSA Key container...
    Succeeded!
    

    Puede comprobar la ACL del archivo en la siguiente carpeta:

    \Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys

    El archivo del contenedor de claves RSA tiene la marca de hora más reciente en esta carpeta.

  7. Para volver a cambiar la sección connectionStrings a texto sin cifrar, ejecute el siguiente comando desde el símbolo del sistema:

    aspnet_regiis -pd "connectionStrings" -app "/MachineRSA"

    Si el comando funciona correctamente, verá el siguiente resultado:

    Decrypting configuration section...
    Succeeded!
    

    Para descifrar la sección connectionStrings en la que se especifica una ruta física hasta el archivo de configuración de la aplicación, utilice el modificador -pdf tal y como se muestra a continuación.

    aspnet_regiis -pdf "connectionStrings" C:\Projects\MachineRSA

Uso de RSA con contenedores de claves en el nivel de usuario para cifrar cadenas de conexión en Web.Config

En los siguientes pasos se muestra cómo cifrar una sección <connectionStrings> mediante RSAProtectedConfigurationProvider (RSA) con un contenedor de claves en el nivel de usuario.

De forma predeterminada, las aplicaciones ASP.NET se ejecutan en la cuenta NT AUTHORITY \ Servicio de red. Cuando obtenga acceso a secciones de configuración cifradas utilizando el cifrado RSA con el contenedor de claves en el nivel de usuario, asegúrese de que la aplicación se esté ejecutando con la misma identidad de usuario que la cuenta que utilizó para cifrar los datos.

Para cifrar la sección connectionStrings del archivo Web.config

  • Cree un nuevo sitio Web llamado UserRSA. Asegúrese de que este directorio esté configurado como directorio virtual.

  • Agregue un archivo de configuración Web.config a este directorio.

  • Agregue una sección connectionString de muestra parecido al siguiente ejemplo:

    <connectionStrings>
      <add name="MyLocalSQLServer" 
           connectionString="Initial Catalog=aspnetdb;data source=localhost;Integrated 
    	   Security=SSPI;" providerName="System.Data.SqlClient"/>
    </connectionStrings>
    
  • Agregue y configure un proveedor de configuración protegida para utilizar un contenedor en el nivel de usuario. Para ello, agregue la siguiente sección <configProtectedData> al archivo Web.config. Debe establecer useMachineContainer= "false" para iniciar al proveedor que utilice el contenedor de claves en el nivel de usuario. También debe utilizar un nombre de proveedor exclusivo o se generará un error en tiempo de ejecución.

    <configProtectedData>
      <providers>   
        <add keyContainerName="NetFrameworkConfigurationKey"
          useMachineContainer="false"
          description="Uses RsaCryptoServiceProvider to encrypt and decrypt"
          name="MyUserRSAProtectedConfigurationprovider" 
    type="System.Configuration.RsaProtectedConfigurationProvider,System.Configuration, 
    Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        </providers>   
    </configProtectedData>
    
  • Ejecute el siguiente comando desde un símbolo del sistema de SDK para cifrar la sección connectionStrings:

    aspnet_regiis -pe "connectionStrings" -app "/UserRSA" -prov "MyUserRSAProtectedConfigurationProvider"

    • El modificador -pe especifica la sección de configuración que se va a cifrar. Éste es el nombre de elemento XML de la sección de configuración.

      En el caso de elementos anidados, como la sección <pages> que está dentro de <system.web>, el nombre XML tiene que incluir los grupos de sección que contiene; por ejemplo, "system.web/pages".

    • El modificador -app especifica la ruta virtual de la aplicación Web. En el caso de ser una aplicación anidada, es necesario especificar la ruta anidada desde el directorio raíz; por ejemplo, "/test/aspnet/MachineRSA".

    • El modificador -prov especifica el nombre del proveedor. En este caso, éste está establecido como "MyUserRSAProtectedConfigurationProvider", que es el nombre especificado al configurar el proveedor en el paso 4.

    Si el comando funciona correctamente, verá el siguiente resultado:

    Encrypting configuration section...
    Succeeded!
    

    Nota Los contenedores de claves RSA de usuario se almacenan en la siguiente carpeta.

    \Documents and Settings\{NombreUsuario}\Application Data\Microsoft\Crypto\RSA
    
  • Revise el archivo Web.config y examine los cambios. Se han creado los siguientes elementos.

    • <EncryptedData>

    • <EncryptionMethod>

    • <KeyInfo>

    • <EncryptedKey>

    • <KeyName>

    • <CipherData>

    • <CipherValue>

    El archivo Web.Config modificado, con la sección connectionStrings cifrada, debería ser similar al siguiente ejemplo:

    ...
    <connectionStrings configProtectionProvider="MyUserRSAProtectedConfigurationprovider">
        <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"
          xmlns="http://www.w3.org/2001/04/xmlenc#">
          <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
          <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
            <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
              <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
              <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
                <KeyName>Rsa Key</KeyName>
              </KeyInfo>
              <CipherData>
    		  
                <CipherValue>In7jNc0GA1eE5nvVR2hrHQ6cC1O1kMbfBXH0alBwlY2OB
    			M4sMa8NbK4pBnUdxFkrx+oSzLYE8SHS6dYZwE3Uf5x7hk46Jx+Z/hn1hneWMyxW
    			n23t41708lQzySsotYnzL5VOdR4P7MrIlhW9eSpbWp7PopSzcLxlGbs41dH7L3E
    			=</CipherValue>
    			
              </CipherData>
            </EncryptedKey>
          </KeyInfo>
          <CipherData>
    	  
            <CipherValue>Zbu2LQQeiHaUFXWPjLvPR9OLwrozCZj5i2zvcEFlx/UICt2Cn
    		0fTdy51dbHQRjTUXnOyx2PC5vptALXsvxrhPo5I+I2SCr21rRUQ5H55P0ejJZMsAirkN
    		jdhCe5RflVLdK96a6Sw0cz93inWi4rNkE1SiXB76cD08Y+DHrsjmGkW8/TeHCK2f4xS
    		ykmdJGRwpxxdt2+3DxMjQPfg39Xkr4JjRlE6FvQ/R6hkEyyqLmCxUxbTV/+mcBcwyE3
    		AzrbOIl+627SG1fP4ovLmMkNvjlTl5lCZnoj6</CipherValue>
    		
          </CipherData>
        </EncryptedData>
      </connectionStrings>
    ...
    
  • Agregue la siguiente página Web Default.aspx al directorio virtual de la aplicación y, a continuación, desplácese hasta esta página para comprobar que el cifrado y el descifrado funcionan correctamente.

    <%@ Page Language="C#" %>
    
    <script runat="server">
        protected void Page_Load(object sender, EventArgs e)
        {
            Response.Write("Clear text connection string is: " + 
                     ConfigurationManager.ConnectionStrings
                                ["MyLocalSQLServer"].ConnectionString);
        }
    </script>
    <html>
      <body/>
    </html>
    

    Ya que la aplicación tiene que obtener acceso a los datos utilizando la misma identidad que se utilizó para cifrar los datos, a menudo necesitará ejecutar el comando de cifrado utilizando la identidad de cuenta de servicio de la aplicación. Para ello, puede iniciar una ventana de comandos mediante el comando runas, como se muestra a continuación, y especificar un nombre de usuario y dominio adecuados.

    Runas /profile /user:dominio\usuario cmd

    Cuando se ejecuta Aspnet_regiis en la ventana de comandos resultante, la herramienta utiliza la identidad especificada para llevar a cabo el cifrado. De esta forma se permite que la aplicación que utiliza la misma identidad descifre los datos en tiempo de ejecución.

    Si la aplicación se ejecuta en una cuenta distinta a la que se usó para cifrar los datos, ASP.NET no podrá obtener acceso al contenedor de claves RSA en el nivel de usuario y generará el siguiente error:

    Parser Error Message: Failed to decrypt using provider 'RsaProtectedConfigurationProvider'. 
    Error message from the provider: Keyset does not exist
    
  • Para volver a cambiar la sección connectionStrings a texto sin cifrar, ejecute el siguiente comando desde el símbolo del sistema .NET:

    aspnet_regiis -pd "connectionStrings" -app "/UserRSA"

    Si el comando funciona correctamente, verá el siguiente resultado:

    Decrypting configuration section...
    Succeeded!
    

Escenarios de baterías de servidores Web

Puede utilizar el cifrado RSA en baterías de servidores Web, ya que es posible exportar claves RSA. Necesita hacerlo si cifra datos de un archivo Web.config antes de implementarlo en otros servidores de una batería de servidores Web. En este caso, la clave privada necesaria para descifrar los datos se debe exportar e implementar en el resto de servidores.

Utilización del proveedor RSA para cifrar una cadena de conexión del archivo Web.config en una batería de servidores Web

Para hacer esto, debe crear un contenedor de claves de cifrado RSA personalizado e implementar el contenedor en todos los servidores de la batería. Esto no funcionará de forma predeterminada porque la clave de cifrado RSA predeterminada, "NetFrameworkConfigurationKey", es distinta en cada equipo.

Para utilizar el cifrado RSA en una batería de servidores Web

  1. Ejecute el siguiente comando desde un símbolo de sistema para crear una clave de cifrado RSA personalizada:

    aspnet_regiis -pc "CustomKeys" -exp

    El modificador -exp indica que se pueden exportar las claves.

    Si el comando funciona correctamente, verá el siguiente resultado:

    Creating RSA Key container...
    Succeeded!
    

    Puede comprobar que un contenedor de claves personalizado existe si busca el archivo y comprueba las marcas de hora en la siguiente ubicación:

    \Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA
    \MachineKeys 
    
  2. Cree un nuevo proyecto Web llamado WebFarmRSA. Asegúrese de que este directorio esté configurado como directorio virtual.

  3. Agregue un archivo de configuración Web.config a este directorio.

  4. Agregue una sección connectionString de muestra parecido al siguiente ejemplo:

    <connectionStrings>
      <add name="MyLocalSQLServer" 
           connectionString="Initial Catalog=aspnetdb;data source=localhost;Integrated Security=SSPI;" 
    	   providerName="System.Data.SqlClient"/>
    </connectionStrings>
    
  5. Agregue y configure un proveedor personalizado de configuración protegida. Para ello, agregue la siguiente sección <configProtectedData> al archivo Web.config. Tenga en cuenta que el nombre del contenedor de claves está establecido como "CustomKeys", que es el nombre del contenedor creado previamente.

    ...
    <configProtectedData>
      <providers>
      <add keyContainerName="CustomKeys" 
               useMachineContainer="true"
               description="Uses RsaCryptoServiceProvider to encrypt and decrypt"
               name="CustomProvider"       
    		   type="System.Configuration.RsaProtectedConfigurationProvider,
    		   System.Configuration, Version=2.0.0.0, Culture=neutral, 
    		   PublicKeyToken=b03f5f7f11d50a3a" />
    		   
      </providers>
    </configProtectedData>
    ...
    
  6. Ejecute el siguiente comando desde un símbolo del sistema de SDK para cifrar la sección connectionStrings mediante la clave RSA personalizada:

    aspnet_regiis -pe "connectionStrings" -app "/WebFarmRSA" -prov "CustomProvider"

    Si el cifrado funciona correctamente, verá el siguiente resultado:

    Encrypting configuration section...
    Succeeded!
    
  7. Revise el archivo Web.config y examine los cambios. Se han modificado los siguientes elementos:

    • <EncryptedData>

    • <CipherData>

    • <CipherValue>

    El archivo Web.Config modificado, con la sección connectionStrings cifrada, debería ser similar al siguiente ejemplo:

    ...
    <connectionStrings configProtectionProvider="CustomProvider">
        <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"
          xmlns="http://www.w3.org/2001/04/xmlenc#">
          <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
          <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
            <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
              <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
              <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
                <KeyName>Rsa Key</KeyName>
              </KeyInfo>
              <CipherData>
    		  
                <CipherValue>MWOaFwkByLRrvoGYeFUPMmN7e9uwC0D7gFEeyxs3Obll710dLQvD
    			5XaMWcRxg1WwtOE9nysPQRrIJUaCm0b26LGUoa/giGEfvWnslU2kig9SPICzsQAqUSB/
    			inhRckWceb2xdy7TT+EI/vfsu6itJwE2AicMCTwx5I828mP8lV4=</CipherValue>
    			
              </CipherData>
            </EncryptedKey>
          </KeyInfo>
          <CipherData>
    	  
            <CipherValue>IKO9jezdlJ/k1snyw5+e11cd9IVTlVfHBHSiYLgICf1EnMNd5Wx
    		VDZWP1uOW2UaY3Muv7HrSZCRbqq6hfA2uh2rxy5qAzFP+iu7Sg/ku1Zvbwfq8p1UWHvPCu
    		keyrBypiv0wpJ9Tuif7oP4Emgaoa+ewLnETSN411Gow28EKcLpbKWJDOC/9o7g503YM4cn
    		IvkQOomkYlL+MzMb3Rc1FSLiM9ncKQLZi+JkRhlDIxFlsrFpKJhdNf5A0Sq2P71ZLI6G6Q
    		DCehHyn3kCZyBmVWJ0ueoGWXV4y</CipherValue>
    		
          </CipherData>
        </EncryptedData>
      </connectionStrings>
    ...
    
  8. Ejecute el siguiente comando desde un símbolo de sistema .NET para exportar la clave de cifrado RSA personalizada:

    aspnet_regiis -px "CustomKeys" "C:\CustomKeys.xml" -pri

    El modificador -pri hace que se exporten las claves privada y pública. Esto habilita el cifrado y el descifrado. Sin el modificador -pri, sólo podrá cifrar con la clave exportada.

    Si el comando funciona correctamente, verá el siguiente resultado:

    Exporting RSA Keys to file...
    Succeeded!
    
  9. Implemente la aplicación y el archivo Web.config cifrado en otro equipo servidor. Copie también el archivo CustomKeys.xml en un directorio local del otro servidor, por ejemplo en el directorio C:\.

  10. En el servidor de destino, ejecute el siguiente comando desde un símbolo de sistema para importar las claves de cifrado RSA personalizadas:

    aspnet_regiis -pi "CustomKeys" "C:\CustomKeys.xml"

    Si el comando funciona correctamente, verá el siguiente resultado:

    Importing RSA Keys from file..
    Succeeded!
    
  11. Conceda acceso a la identidad de la aplicación ASP.NET.

    La cuenta utilizada para ejecutar la aplicación Web tiene que poder leer el contenedor de claves RSA. Si no está seguro de qué identidad utiliza la aplicación, puede comprobarlo al agregar el siguiente código a una página Web:

    using System.Security.Principal;
    ...
    protected void Page_Load(object sender, EventArgs e)
    {
        Response.Write(WindowsIdentity.GetCurrent().Name);
    }
    

    De forma predeterminada, las aplicaciones ASP.NET de Windows Server 2003 se ejecutan utilizando la cuenta NT Authority\Servicio de red. El siguiente comando concede a esta cuenta acceso al almacén CustomKeys:

    aspnet_regiis -pa "CustomKeys" "NT Authority\Servicio de red"

    Si el comando funciona correctamente, verá el siguiente resultado:

    Adding ACL for access to the RSA Key container...
    Succeeded!
    

    Puede comprobar la ACL del archivo en la siguiente carpeta:

    \Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys
    

    El archivo que contiene la clave RSA tiene la marca de hora más reciente en esta carpeta.

  12. Agregue la siguiente página Web Default.aspx al directorio virtual de la aplicación y, a continuación, desplácese hasta esta página para comprobar que el cifrado y el descifrado funcionan correctamente.

    <%@ Page Language="C#" %>
    
    <script runat="server">
        protected void Page_Load(object sender, EventArgs e)
        {
            Response.Write("Clear text connection string is: " + 
                     ConfigurationManager.ConnectionStrings
                                ["MyLocalSQLServer"].ConnectionString);
        }
    </script>
    <html>
      <body/>
    </html>
    

    MyLocalSQLServer es el nombre de la cadena de conexión que ha especificado previamente en el archivo Web.config.

Recursos adicionales

How To: Encrypt Configuration Sections in ASP.NET 2.0 Using DPAPI (en inglés)

Comentarios

Si desea enviar comentarios puede utilizar la wikipedia (en inglés) o el correo electrónico:

Nos interesan especialmente sus comentarios sobre los aspectos siguientes:

  • Problemas técnicos relacionados con nuestras recomendaciones

  • Problemas de aprovechamiento y utilidad

Soporte técnico

Los servicios de soporte de Microsoft ofrecen el soporte técnico de los productos y tecnologías de Microsoft a los que se hace referencia en esta guía. Para obtener información sobre soporte, visite el sitio Web de soporte de Microsoft en http://msdn.microsoft.com/security/default.aspx?pull=/isapi/gosupport.asp?Target=/.

Comunidad y grupos de noticias

El soporte técnico de la comunidad se ofrece en los foros y grupos de noticias:

Para sacar el mayor partido de estos foros, busque el grupo de noticias correspondiente a su tecnología o problema. Por ejemplo, si tiene un problema con las características de seguridad de ASP.NET, debería utilizar el foro de seguridad de ASP.NET (ASP.NET Security).

Colaboradores y revisores

  • Colaboradores y revisores externos: Andy Eunson; Chris Ullman, Content Master; David Raphael, Foundstone Professional Services, Rudolph Araujo, Foundstone Professional Services; Manoranjan M. Paul

  • Colaboradores y revisores de PSS y Microsoft Consulting Services: Wade Mascia, Tom Christian, Adam Semel, Nobuyuki Akama, Microsoft Corporation

  • Colaboradores y revisores de Microsoft Product Group: Stefan Schackow, Vikas Malhotra, Microsoft Corporation

  • Colaboradores y revisores de MSDN: Kent Sharkey, Microsoft Corporation

  • Colaboradores y revisores de Microsoft IT: Eric Rachner, Shawn Veney (ACE Team), Microsoft Corporation

  • Equipo de pruebas: Larry Brader, Microsoft Corporation; Nadupalli Venkata Surya Sateesh, Sivanthapatham Shanmugasundaram, Sameer Tarey, Infosys Technologies Ltd.

  • Equipo de edición: Nelly Delgado, Microsoft Corporation; Sharon Smith, Tina Burden McGrayne, Linda Werner & Associates Inc.

  • Dirección de publicación: Sanjeev Garg, Satyam Computer Services

Mostrar:
© 2015 Microsoft