Tutorial: Crear y exportar un contenedor de claves RSA

Actualización: noviembre 2007

Proporciona un ejemplo paso a paso para crear, exportar e importar una clave de cifrado para descifrar las secciones cifradas de un único archivo Web.config cifrado para varios servidores.

La configuración protegida ayuda a mejorar la seguridad de una aplicación permitiéndole cifrar información confidencial almacenada en un archivo de configuración. .NET Framework descifra automáticamente el archivo de configuración cuando éste se procesa, y el descifrado no requiere ningún código adicional. Puede utilizar aspnet_regiis.exe para cifrar las secciones del archivo de configuración y administrar las claves de cifrado. Para obtener más información sobre la configuración protegida, vea Cifrar información de configuración mediante una configuración protegida.

La configuración protegida permite crear, eliminar, exportar e importar claves de cifrado personalizadas para usarlas con el proveedor RsaProtectedConfigurationProvider. Esto permite crear copias de seguridad de las claves de cifrado o copiar una clave de cifrado en varios servidores Web, por ejemplo una batería de servidores Web, para que una aplicación que tenga un archivo Web.config cifrado se pueda copiar en varias ubicaciones.

Durante este tutorial aprenderá a realizar lo siguiente:

  • Crear un contenedor de claves RSA personalizado.

  • Especificar un proveedor de configuración protegida que utilice un contenedor de claves RSA personalizado.

  • Cifrar las secciones de un archivo Web.config utilizando un contenedor de claves RSA personalizado.

  • Exportar un contenedor de claves RSA personalizado a un archivo XML.

  • Importar un contenedor de claves RSA personalizado a un archivo XML.

Requisitos previos

Para poder completar este tutorial, necesitará lo siguiente:

Crear un contenedor de claves RSA personalizado

En esta parte del tutorial, creará un contenedor de claves RSA utilizando aspnet_regiis.exe con la opción -pc. Esto identifica el contenedor de claves RSA como un contenedor de claves de nivel del usuario. Los contenedores de claves RSA se deben identificar como de nivel del usuario (utilizando la opción -pku) o como de nivel de equipo (omitiendo la opción -pku). Para obtener más información sobre los contenedores de claves RSA de nivel de equipo y de nivel de usuario, vea Descripción de los contenedores de claves RSA en el nivel de equipo y de usuario.

Para crear un contenedor de claves RSA en el nivel del equipo

  1. Abra un símbolo del sistema.

    • Para ello, en Microsoft Windows, haga clic en Inicio y en Ejecutar; después, en el cuadro Abrir, escriba cmd y haga clic en Aceptar.
  2. En el símbolo del sistema, escriba el comando siguiente para cambiar al directorio de .NET Framework 2.0:

    cd \WINDOWS\Microsoft.Net\Framework\v2.0.*

  3. Cree un nuevo contenedor de claves RSA de nivel de equipo; para ello, ejecute aspnet_regiis.exe con las opciones siguientes:

    • La opción -pc seguida del nombre del contenedor de claves RSA, para crear el par de claves RSA.

    • La opción -exp para garantizar que la clave se puede exportar.

    El comando siguiente creará el contenedor de claves "MyKeys".

    aspnet_regiis -pc "MyKeys" -exp

    No cierre la ventana del símbolo del sistema.

Conceder acceso de lectura a una clave de cifrado RSA

Para que ASP.NET pueda descifrar la información cifrada del archivo Web.config, la identidad de la aplicación ASP.NET deberá tener acceso de lectura a la clave de cifrado que se utiliza para cifrar y descifrar las secciones cifradas.

Para conceder a la identidad ASP.NET acceso al contenedor de claves RSA

  1. Abra un editor de texto y copie el código siguiente en un nuevo archivo.

    <%@ Page Language="VB" %>
    <%
    Response.Write(System.Security.Principal.WindowsIdentity.GetCurrent().Name)
    %>
    
    <%@ Page Language="C#" %>
    <%
    Response.Write(System.Security.Principal.WindowsIdentity.GetCurrent().Name);
    %>
    
  2. Guarde el archivo en el directorio de la aplicación como identity.aspx.

  3. Para determinar la identidad de su aplicación ASP.NET, abra identity.aspx en un explorador.

    La identidad suplantada de la aplicación ASP.NET aparece en el explorador.

    Nota:

    En este tutorial, no utilice la autenticación de suplantación para el sitio. Es decir, utilice sólo la autenticación anónima como la identidad de la aplicación ASP.NET. En este tutorial, si la identidad de la aplicación es el id. de usuario con el que ha iniciado la sesión actual, como DOMAIN\userid, en el archivo Web.config de la aplicación, deshabilite la suplantación. Para deshabilitar la suplantación, edite el archivo Web.config y quite el elemento <identity>. Después de realizar este cambio, actualice identity.aspx en su explorador para mostrar la identidad modificada para la aplicación.

  4. En el símbolo del sistema, utilice las opciones siguientes para conceder a la identidad acceso al contenedor de claves RSA ejecutando aspnet_regiis.exe:

    • La opción -pa seguida del nombre del contenedor de claves RSA "MyKeys".

    • La identidad de la aplicación ASP.NET, tal como se determinó en el paso anterior.

    Por ejemplo, el comando siguiente concede a la cuenta NETWORK SERVICE acceso al contenedor de claves RSA "MyKeys" en el nivel de equipo.

    aspnet_regiis -pa "MyKeys" "NT AUTHORITY\NETWORK SERVICE"

Especificar un proveedor de configuración protegida

En esta parte del tutorial, especificará una instancia de un proveedor de configuración protegida en el archivo Web.config de la aplicación ASP.NET. La instancia de proveedor de configuración protegida que utiliza el contenedor de claves RSA de nivel de equipo denominado "MyKeys" es el que ha creado en el procedimiento anterior.

Para especificar una instancia del proveedor de configuración protegida

  1. Abra un editor de texto y abra el archivo Web.config de la aplicación ASP.NET.

    • Si no tiene un archivo Web.config para la aplicación ASP.NET, abra un editor de texto y copie la configuración de ejemplo en un nuevo archivo. Guarde el archivo como web.config en el directorio de la aplicación ASP.NET.
  2. Compruebe que la configuración incluye un elemento <connectionStrings>, como se muestra en el ejemplo siguiente.

    <configuration>
       <connectionStrings>
          <add name="SqlServices" connectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;" />
       </connectionStrings>
    </configuration>
    
  3. Agregue una sección <configProtectedData> que incluya una instancia de la clase RsaProtectedConfigurationProvider denominada "MyProvider" y que utilice el contenedor de claves RSA de nivel de equipo denominado "MyKeys", como se muestra en el ejemplo siguiente.

    <configuration>
       <configProtectedData>
          <providers>
             <add name="MyProvider"
                  type="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0. 0.0,
                        Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a,
                        processorArchitecture=MSIL"
                  keyContainerName="MyKeys" 
                  useMachineContainer="true" />
          </providers>
       </configProtectedData>
    
       <connectionStrings>
          <add name="SqlServices" connectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;" />
       </connectionStrings>
    </configuration>
    
  4. Guarde y cierre el archivo Web.config.

Cifrar secciones del archivo Web.config

Ahora que ya ha especificado una instancia de la clase RsaProtectedConfigurationProvider que utiliza el contenedor de claves RSA "MyKeys" y la identidad de la aplicación ASP.NET tiene acceso de lectura a "MyKeys", cifrará las secciones del archivo Web.config de la aplicación ASP.NET utilizando "MyKeys" y, después, ASP.NET descifrará las secciones cuando lo procese.

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

  1. En el símbolo del sistema, ejecute aspnet_regiis.exe con las opciones siguientes:

    • La opción -pe, seguida de "connectionStrings" para cifrar el elemento <connectionStrings> del archivo Web.config de la aplicación.

    • La opción -app, para identificar el nombre de su aplicación.

    • La opción -prov, seguida de "MyProvider", para identificar el proveedor RsaProtectedConfigurationProvider que se especificó en el archivo Web.config en la sección anterior.

    Por ejemplo, el comando siguiente cifra la sección <connectionStrings> del archivo Web.config de una aplicación denominada MyApplication.

    aspnet_regiis -pe "connectionStrings" -app "/MyApplication" -prov "MyProvider"

  2. Abra el archivo Web.config y vea el contenido cifrado.

    El contenido será similar al del siguiente archivo Web.config de ejemplo.

    <configuration>
       <configProtectedData>
          <providers>
             <add name="MyProvider"
                  type="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0. 0.0,
                        Culture=neutral, PublicKeyToken= b03f5f7f11d50a3a,
                        processorArchitecture=MSIL"
                  keyContainerName="MyKeys" 
                  useMachineContainer="true" />
          </providers>
       </configProtectedData>
    
       <connectionStrings configProtectionProvider="MyProvider">
          <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>WcFEbDX8VyLfAsVK8g6hZVAG1674ZFc1kWH0BoazgOwdBfinhcAmQmnIn0oHtZ5tO2EXGl+dyh10giEmO9NemH4YZk+iMIln+ItcEay9CGWMXSen9UQLpcQHQqMJErZiPK4qPZaRWwqckLqriCl9X8x9OE7jKIsO2Ibapwj+1Jo=
                      </CipherValue>
                   </CipherData>
                </EncryptedKey>
             </KeyInfo>
             <CipherData>
                <CipherValue>OpWQgQbq2wBZEGYAeV8WF82yz6q5WNFIj3rcuQ8gT0MP97aO9SHIZWwNggSEi2Ywi4oMaHX9p0NaJXG76aoMR9L/WasAxEwzQz3fexFgFSrGPful/5txSPTAGcqUb1PEBVlB9CA71UXIGVCPTiwF7zYDu8sSHhWa0fNXqVHHdLQYy1DfhXS3cO61vW5e/KYmKOGA4mjqT0VZaXgb9tVeGBDhjPh5ZlrLMNfYSozeJ+m2Lsm7hnF6VvFm3fFMXa6+h0JTHeCXBdmzg/vQb0u3oejSGzB4ly+V9O0T4Yxkwn9KVDW58PHOeRT2//3iZfJfWV2NZ4e6vj4Byjf81o3JVNgRjmm9hr9blVbbT3Q8/j5zJ+TElCn6zPHvnuB70iG2KPJXqAj2GBzBk6cHq+WNebOQNWIb7dTPumuZK0yW1XDZ5gkfBuqgn8hmosTE7mCvieP9rgATf6qgLgdA6zYyVV6WDjo1qbCV807lczxa3bF5KzKaVUSq5FS1SpdZKAE6/kkr0Ps++CE=
                </CipherValue>
             </CipherData>
          </EncryptedData>
       </connectionStrings>
    </configuration>
    
  3. Cierre el archivo Web.config.

Obtener acceso a las opciones de configuración descifradas

ASP.NET descifra automáticamente el contenido del archivo Web.config cuando lo procesa. Por esta razón, no es necesario que haga nada para descifrar los valores de configuración cifrados para que los usen otras funciones de ASP.NET o para tener acceso a los valores del código. Sin embargo, puede seguir los pasos siguientes para ver la configuración descifrada.

Para ver los valores de configuración descifrados

  1. Abra un editor de texto y copie el código ASP.NET siguiente en un nuevo archivo.

    <%@ Page Language="VB" %>
    <%@ Import Namespace="System.Configuration" %>
    <script >
    
    Public Sub Page_Load()
    
      ConnectionStringsGrid.DataSource = ConfigurationManager.ConnectionStrings
      ConnectionStringsGrid.DataBind()
    End Sub
    
    </script>
    <html>
    
    <body>
    
    <form >
      <asp:GridView  CellPadding="4" id="ConnectionStringsGrid" />
    </form>
    
    </body>
    </html>
    
    <%@ Page Language="C#" %>
    <%@ Import Namespace="System.Configuration" %>
    <script >
    
    public void Page_Load()
    {
      ConnectionStringsGrid.DataSource = ConfigurationManager.ConnectionStrings;
      ConnectionStringsGrid.DataBind();
    }
    
    </script>
    <html>
    
    <body>
    
    <form >
      <asp:GridView  CellPadding="4" id="ConnectionStringsGrid" />
    </form>
    
    </body>
    </html>
    
  2. Guarde el archivo como walkthrough.aspx y, a continuación, vea el archivo en el explorador.

    Verá los valores descifrados de su archivo Web.config cifrado.

Exportar e importar un contenedor de claves RSA

Puede exportar un contenedor de claves RSA a un archivo XML como copia de seguridad de los valores de las claves o copiar el contenedor de claves a otros servidores Web que vayan a alojar una copia de la aplicación que incluye el archivo Web.config cifrado. Sin el contenedor de claves RSA específico utilizado para cifrar el archivo Web.config, ASP.NET no puede descifrar los valores de configuración cifrados.

Para ver los valores de configuración descifrados

  1. En el símbolo del sistema, ejecute aspnet_regiis.exe con las opciones siguientes:

    • La opción -px seguida de "MyKeys", que es el nombre del contenedor de claves RSA creado antes, en el paso "Crear un contenedor de claves RSA personalizado" de este tutorial.

    • La ruta de acceso al archivo .xml al que se exportará el contenedor de claves.

    • La opción -pri para garantizar que se exporta la información de clave privada. De lo contrario, la información de clave exportada cifrará la información pero no la descifrará.

    Por ejemplo, el comando siguiente exporta el contenedor de claves RSA de nivel de equipo denominado "MyKeys" a un archivo .xml denominado keys.xml en el directorio raíz de la unidad C.

    aspnet_regiis -px "MyKeys" "c:\keys.xml" -pri

    Nota:

    Para estar seguro de que nadie puede descifrar los archivos Web.config cifrados por el contenedor de claves RSA, después de exportar el contenedor a un archivo .xml, copie este archivo en una ubicación fuera del servidor Web y, después, elimine el archivo del servidor Web.

    Ahora ya tiene toda la información necesaria para copiar la aplicación en un servidor Web independiente utilizando el archivo Web.config cifrado.

  2. Si desea copiar la aplicación en un servidor Web independiente con el archivo Web.config cifrado, vaya al paso 4.

  3. Si no tiene otro servidor Web donde copiar la aplicación Web y desea continuar con este tutorial, realice los pasos siguientes para eliminar el contenedor de claves RSA del servidor Web. A continuación, trate el servidor Web como si fuese otro distinto.

    1. Para eliminar el contenedor de claves RSA, en el símbolo del sistema, ejecute aspnet_regiis.exe con el modificador -pz seguido de "MyKeys".

      Por ejemplo, el siguiente comando elimina "MyKeys":

      aspnet_regiis -pz "MyKeys"

    2. Vaya al paso 5.

  4. Copie la aplicación Web, incluido el archivo Web.config cifrado, a un segundo servidor Web.

  5. En el segundo servidor, abra una ventana del símbolo del sistema y escriba el comando siguiente para cambiar al directorio de .NET Framework 2.0:

    cd \WINDOWS\Microsoft.Net\Framework\v2.0.*

  6. Copie el archivo .xml que incluye el contenedor de claves RSA exportado en el directorio de .NET Framework 2.0 del segundo servidor Web.

    En este tutorial, copiará el archivo keys.xml en el directorio raíz de la unidad C.

  7. En el segundo servidor Web, en el símbolo del sistema, ejecute aspnet_regiis.exe con las opciones siguientes:

    • La opción -pi seguida de "MyKeys", que es el nombre del contenedor de claves exportado, para importar el contenedor de claves RSA.

    • La ruta de acceso al archivo .xml que contiene el contenedor de claves exportado.

    Por ejemplo, el comando siguiente importa el contenedor de claves RSA denominado "MyKeys".

    aspnet_regiis -pi "MyKeys" "c:\keys.xml"

  8. En el segundo servidor Web, elimine la copia del archivo .xml que contiene el contenedor de claves RSA exportado.

  9. En el segundo servidor Web, determine la identidad de la aplicación ASP.NET y, después, conceda a esa identidad acceso al contenedor de claves RSA importado siguiendo los pasos de la sección "Conceder acceso de lectura a una clave de cifrado RSA" de este tutorial.

  10. En el segundo servidor Web, vea los valores de configuración descifrados del archivo Web.config cifrado siguiendo los pasos de la sección anterior.

Vea también

Tareas

Tutorial: Cifrar la información de configuración mediante la configuración protegida

Otros recursos

Cifrar información de configuración mediante una configuración protegida