Importar y exportar contenedores de claves RSA con configuración protegida

Actualización: noviembre 2007

La configuración protegida permite crear, eliminar, exportar e importar contenedores de claves RSA cuando se utiliza el proveedor RsaProtectedConfigurationProvider. Un escenario donde podría ser útil sería una batería de servidores Web en la que se va a implementar el mismo archivo Web.config cifrado en varios servidores. En ese caso, también se debe implementar el mismo contenedor de claves RSA en dichos servidores. Para ello, tendría que crear un contenedor de claves RSA para la aplicación, exportarlo a un archivo XML e importarlo en cada servidor que deba descifrar el archivo Web.config cifrado.

Crear contenedores de claves RSA también puede resultar útil en un único servidor Web que aloje varias aplicaciones ASP.NET. Si crea un contenedor de claves RSA para cada aplicación o para cada conjunto de aplicaciones de un único cliente, puede mejorar la seguridad de la información de configuración confidencial de una aplicación, garantizando que el archivo Web.config de una aplicación no se pueda descifrar mediante el contenedor de claves RSA de otra aplicación.

Crear un contenedor de claves RSA

Para crear un contenedor de claves RSA, se utiliza la herramienta de registro de IIS en ASP.NET (Aspnet_regiis.exe) con el modificador –pc. Debe asignar al contenedor de claves un nombre que identifique el contenedor de claves utilizado por el proveedor RsaProtectedConfigurationProvider especificado en la sección configProtectedData del archivo Web.config de la aplicación. Para asegurarse de que se pueda exportar el contenedor de claves RSA que acaba de crear, incluya la opción -exp.

Por ejemplo, el comando siguiente crea un contenedor de claves RSA denominado SampleKeys que es un contenedor de claves en el nivel del equipo y es exportable.

aspnet_regiis -pc "SampleKeys"–exp

El ejemplo siguiente muestra la sección configProtectedData de un archivo Web.config. La sección especifica un proveedor RsaProtectedConfigurationProvider que utiliza un contenedor de claves RSA de nivel de equipo denominado SampleKeys.

<configProtectedData>
   <providers>
      <add name="SampleProvider" 
           type="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0.0.0,
                 Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
                 processorArchitecture=MSIL"
           keyContainerName="SampleKeys" 
           useMachineContainer="true" />
   </providers>
</configProtectedData>

Conceder autoridad para obtener acceso a un contenedor de claves RSA

De manera predeterminada, los contenedores de claves RSA están totalmente protegidos mediante listas de control de acceso (ACL) NTFS en el servidor donde se instalan. Esto mejora la seguridad de la información cifrada, limitando quién puede tener acceso a la clave de cifrado.

Para que ASP.NET pueda utilizar un contenedor de claves RSA, la identidad de proceso de la aplicación ASP.NET debe recibir autorización para tener acceso de lectura en ese contenedor. Para obtener información sobre cómo configurar y determinar la identidad de su aplicación ASP.NET, vea Suplantación de ASP.NET.

Puede utilizar la herramienta Aspnet_regiis.exe con el modificador -pa para conceder a la identidad de la aplicación ASP.NET permiso para leer un contenedor de claves RSA. Por ejemplo, el comando siguiente concede a la cuenta NETWORK SERVICE de Windows Server 2003 acceso para leer el contenedor de claves RSA de nivel de equipo denominado SampleKeys.

aspnet_regiis -pa "SampleKeys" "NT AUTHORITY\NETWORK SERVICE"
Nota:

Si el contenedor de claves RSA es un contenedor de nivel de usuario, debe iniciar sesión como el usuario en cuyo perfil de Windows se almacena la clave y debe incluir la opción -pku para conceder acceso al contenedor de claves RSA de nivel de usuario. Para obtener más información, vea Descripción de los contenedores de claves RSA en el nivel de equipo y de usuario.

Para utilizar el proveedor RsaProtectedConfigurationProvider predeterminado que se especifica en la configuración del equipo, primero debe conceder a la identidad de Windows de la aplicación acceso al contenedor de claves del equipo denominado NetFrameworkConfigurationKey, que es el contenedor de claves especificado para el proveedor predeterminado. Por ejemplo, el comando siguiente concede a la cuenta NETWORK SERVICE acceso al contenedor de claves RSA utilizado por el proveedor RsaProtectedConfigurationProvider predeterminado.

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

El contenedor de claves RSA NetFrameworkConfigurationKey es el contenedor de claves predeterminado para los comandos emitidos por la herramienta Aspnet_regiis.exe. Por tanto, el comando anterior también podría ejecutarse de la siguiente manera:

aspnet_regiis -pa "NT AUTHORITY\NETWORK SERVICE"

Exportar un contenedor de claves RSA

Para exportar un contenedor de claves RSA a un archivo XML, puede utilizar la herramienta Aspnet_regiis.exe con el modificador –px. Puede utilizar el archivo XML como copia de seguridad del contenedor de claves RSA o importar el contenedor de claves RSA en un servidor diferente. La parte de clave privada del contenedor de claves RSA es necesaria para descifrar la información cifrada. Para utilizar el contenedor de claves exportado en otro servidor, también necesitará importar la clave privada. Para incluir la clave privada en el archivo XML, puede especificar la opción –pri al exportar la clave. También deberá especificar si el contenedor de claves exportado está en el nivel del equipo o en el nivel del usuario. Para exportar un contenedor de claves en el nivel del usuario, deberá haber iniciado una sesión como el usuario en cuyo perfil de Windows está almacenada la clave. Para especificar una clave en el nivel del usuario, incluya la opción -pku al exportar la información de la clave de cifrado; de lo contrario, la clave exportada procederá del almacén de claves del equipo. Para obtener más información sobre las claves de cifrado en el nivel de equipo y el nivel de usuario, vea Descripción de los contenedores de claves RSA en el nivel de equipo y de usuario.

Por ejemplo, el comando siguiente exporta el contenedor de claves RSA en el nivel del equipo denominado SampleKeys al archivo denominado keys.xml e incluye la información de la clave privada.

aspnet_regiis -px "SampleKeys" keys.xml -pri
Nota:

Por seguridad, después de exportar un contenedor de claves RSA a un archivo XML, copie el archivo XML en una ubicación ajena al servidor y elimine el archivo XML de éste. De esta forma reducirá la posibilidad de que un atacante obtenga acceso al contenedor de claves RSA y pueda descifrar los archivos Web.config cifrados utilizando ese contenedor.

Importar un contenedor de claves RSA

Puede utilizar la herramienta Aspnet_regiis.exe con el modificador –pi para importar un contenedor de claves RSA desde un archivo XML. También debe especificar si el contenedor de claves importado es un contenedor de nivel de equipo o de nivel de usuario. Para importar un contenedor de claves en el nivel del usuario, deberá haber iniciado una sesión como el usuario en cuyo perfil de Windows se almacenará la clave. Para especificar una clave de nivel de usuario, incluya la opción -pku al importar la información de la clave de cifrado; de lo contrario, la clave exportada se importará al almacén de claves del equipo.

Por ejemplo, el comando siguiente importa un contenedor de claves RSA de nivel de equipo denominado SampleKeys desde el archivo keys.xml.

aspnet_regiis -pi "SampleKeys" keys.xml

La identidad de la aplicación ASP.NET que va a utilizar el contenedor de claves RSA importado debe disponer de autoridad para leer el contenido del contenedor de claves RSA. Para obtener más información, vea Conceder autoridad para obtener acceso a un contenedor de claves RSA, anteriormente en este tema.

Eliminar un contenedor de claves RSA

Para eliminar un contenedor de claves RSA, puede utilizar la herramienta Aspnet_regiis.exe con el modificador –pz. Antes de eliminar un contenedor de claves RSA, compruebe que ha exportado la clave a un archivo XML para que se pueda importar después, o que no hay ninguna información cifrada con el contenedor de claves RSA que tenga que descifrarse alguna vez.

Al eliminar un contenedor de claves RSA, deberá especificar el nombre del contenedor de claves e identificar si el contenedor se encuentra en el nivel del equipo o en el nivel del usuario. Para eliminar un contenedor de claves en el nivel del usuario, deberá haber iniciado una sesión como el usuario en cuyo perfil de Windows está almacenada la clave.

Por ejemplo, el comando siguiente elimina el contenedor de claves RSA en el nivel del equipo denominado SampleKeys.

aspnet_regiis -pz "SampleKeys"

Vea también

Tareas

Tutorial: Crear y exportar un contenedor de claves RSA

Otros recursos

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