
受保护的配置提供了在使用 RsaProtectedConfigurationProvider 时创建、删除、导出和导入 RSA 密钥容器的能力。对于将同一个经过加密的 Web.config 文件部署到数台服务器上的网络场,这会非常有用。在这种情况下,还必须将相同的 RSA 密钥容器部署到这些服务器上。为了实现此目的,需要为应用程序创建一个 RSA 密钥容器,将它导出到 XML 文件,然后在每台需要对加密的 Web.config 文件进行解密的服务器上导入该文件。
在承载多个 ASP.NET 应用程序的单台 Web 服务器上,创建 RSA 密钥容器也非常有用。通过为一个客户的每个或每组应用程序都创建一个 RSA 密钥容器,可以确保一个应用程序
的 RSA 密钥容器不能用来对另一个应用程序的 Web.config 文件进行解密,从而提高应用程序的敏感配置信息的安全性。
创建 RSA 密钥容器
若要创建 RSA 密钥容器,请使用 ASP.NET IIS 注册工具 (Aspnet_regiis.exe) 及 –pc 开关。必须为密钥容器指定一个名称,该名称标识应用程序的 Web.config 文件的 configProtectedData 节中指定的 RsaProtectedConfigurationProvider 所使用的密钥容器。为确保可以导出新创建的 RSA 密钥容器,必须包括 -exp 选项。
例如,下面的命令创建一个名为 SampleKeys 的 RSA 密钥容器,该容器是可导出的计算机级密钥容器。
aspnet_regiis -pc "SampleKeys"–exp
下面的示例演示了 Web.config 文件的 configProtectedData 节。该节指定使用名为 SampleKeys 的计算机级 RSA 密钥容器的 RsaProtectedConfigurationProvider。
<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>说明:
为了防止无意删除受保护的配置节的加密和解密密钥,卸载 .NET Framework 时不会删除 RSA 密钥容器。
授予对 RSA 密钥容器的访问权限
默认情况下,RSA 密钥容器受到所在服务器上的 NTFS 访问控制列表 (ACL) 的严密保护。这样能够限制可以访问加密密钥的人员,从而增强加密信息的安全性。
必须首先向 ASP.NET 应用程序的进程标识授予对该 RSA 密钥容器的读取访问权限,然后 ASP.NET 才能使用 RSA 密钥容器。有关设置和确定 ASP.NET 应用程序标识的信息,请参
见 ASP.NET 模拟。
可以使用 Aspnet_regiis.exe 工具及 -pa 开关,向 ASP.NET 应用程序的标识授予读取 RSA 密钥容器的权限。例如,下面的命令向 Windows Server 2003 NETWORK SERVICE 帐户授予对名为 SampleKeys 的计算机级 RSA 密钥容器的读取访问权限:
aspnet_regiis -pa "SampleKeys" "NT AUTHORITY\NETWORK SERVICE"
说明:
如果 RSA 密钥容器是用户级容器,必须以其 Windows 配置文件存储了密钥的用户的身份登录,并且必须包括 -pku 选项以授予对该用户级 RSA 密钥容器的访问权限。有关更多信
息,请参见了解计算机级别和用户级别的 RSA 密钥容器。
若要使用计算机配置中指定的默认 RsaProtectedConfigurationProvider,必须首先向应用程序的 Windows 标识授予对名为 NetFrameworkConfigurationKey 的计算机密钥容器的访问权限,该计算机密钥容器是为该默认提供程序指定的密钥容器。例如,下面的命令向 NETWORK SERVICE 帐户授予对默认 RsaProtectedConfigurationProvider 所使用的 RSA 密钥容器的访问权限。
aspnet_regiis -pa "NetFrameworkConfigurationKey" "NT AUTHORITY\NETWORK SERVICE"NetFrameworkConfigurationKey RSA 密钥容器是 Aspnet_regiis.exe 工具所发出的命令
的默认密钥容器。因此上述命令也可以按以下方式发出:
aspnet_regiis -pa "NT AUTHORITY\NETWORK SERVICE" 导出 RSA 密钥容器
若要将 RSA 密钥容器导出到 XML 文件,可以使用 Aspnet_regiis.exe 工具及 –px 开关。XML 文件可以用作 RSA 密钥容器的备份,也可用于在其他服务器上导入 RSA 密钥容器。若要对加密信息进行解密,RSA 密钥容器的私钥部分是必需的。若要在另一台服务器上使用导出的密钥容器,还需导入私钥。通过在导出密钥时指定 –pri 选项,可以在 XML 文件中包括私钥。还必须指定导出的密钥容器是计算机级还是用户级的。若要导出用户级密钥容器,必须以其 Windows 配置文件存储了密钥的用户的身份登录。若要指定用户级密钥,请在导出加密密钥信息时包括 -pku 选项;否则,导出的密钥将来自计算机密钥存储区。有关计算机级和用户级加密密钥的更多信息,请参见了解计算机级别和用户级别的 RSA 密钥容器。
例如,下面的命令将名为 SampleKeys 的计算机级 RSA 密钥容器导出到名为 keys.xml 的文件中并包括了私钥信息。
aspnet_regiis -px "SampleKeys" keys.xml -pri
说明:
出于安全原因,在将 RSA 密钥容器导出到某个 XML 文件之后,请将该 XML 文件复制到服务器外部的一个位置并将该 XML 文件从服务器中删除。这样能够减少攻击者访问到您的
RSA 密钥容器的机会,因而可降低攻击者对使用该 RSA 密钥容器加密的 Web.config 文件进行解密的能力。
导入 RSA 密钥容器
可以使用 Aspnet_regiis.exe 工具和 –pi 开关,从 XML 文件导入 RSA 密钥容器。还必须指定导入的密钥容器是计算机级还是用户级的密钥容器。若要导入用户级密钥容器,必须以将在其 Windows 配置文件中存储密钥的用户的身份登录。若要指定用户级密钥,请在导入加密密钥信息时包括 -pku 选项;否则,导出的密钥将导入到计算机密钥存储区中。
例如,下面的命令从名为 keys.xml 的文件中导入名为 SampleKeys 的计算机级 RSA 密钥容器:
aspnet_regiis -pi "SampleKeys" keys.xml必须向将使用所导入 RSA 密钥容器的 ASP.NET 应用程序的标识授予对该 RSA 密钥容器内容的读取权限。有关更多信息,请参见本主题前面的“Granting Authority to Access an RSA Key Container”(授予对 RSA 密钥容器的访问权限)。
删除 RSA 密钥容器
若要删除 RSA 密钥容器,可以使用 Aspnet_regiis.exe 工具和 –pz 开关。在删除 RSA 密钥容器之前,请确保已经将密钥导出到 XML 文件中以便能够在以后导入,或者确保不
需要解密任何用 RSA 密钥容器加密的信息。
在删除某个 RSA 密钥容器时,必须指定该密钥容器的名称,并将该容器标识为计算机级或用户级。若要删除用户级密钥容器,必须以其 Windows 配置文件存储了密钥的用户的身份登录。
例如,下面的命令删除名为 SampleKeys 的计算机级 RSA 密钥容器。
aspnet_regiis -pz "SampleKeys"