提供从多台服务器上的一个加密文件创建、导出和导入加密密钥对已加密的 Web.config 文件的节进行解密的逐步骤示例。
由于您可以对存储在配置文件中的敏感信息进行加密,“受保护配置”有助于提高应用程序的安全性。在 .NET Framework 处理配置文件时,它会自动解密该文件,而且解密时不需要任何其他代码。可以使用 aspnet_regiis.exe 对配置文件的节进行加密并管理加密密钥。有关受保护的配置的更多信息,请参见使用受保护的配置加密配置信息。
“受保护配置”使您能够创建、删除、导出和导入自定义的加密密钥以用于 RsaProtectedConfigurationProvider 提供程序。您可以创建加密密钥的备份副本或将加密密钥复制到多台 Web 服务器(如网络场),这样即可将包含已加密 Web.config 文件的应用程序复制到多个位置。
通过此演练,您将学会如何执行以下任务:
创建自定义的 RSA 密钥容器。
指定使用自定义 RSA 密钥容器的“受保护配置”提供程序。
使用自定义 RSA 密钥容器对 Web.config 文件的节进行加密。
将自定义的 RSA 密钥容器导出到 XML 文件。
从 XML 文件导入自定义的 RSA 密钥容器。
为了完成本演练,您需要:
在将要承载该站点的计算机上安装并配置 Microsoft Internet 信息服务 (IIS)。
有关如何安装和配置 IIS 的详细信息,请参见 IIS 安装随附的联机帮助或转到 “Internet Information Services (IIS) 6.0 Technical Resources”(Internet 信息服务 (IIS) 6.0 技术资源)。
ASP.NET 网站。
如果您有网站,则可以在本演练中使用该网站。否则,有关如何创建虚拟目录或网站的详细信息,请参见如何:在 IIS 中创建和配置虚拟目录。
在本演练的这一部分中,您将通过使用带有 -pc 选项的 aspnet_regiis.exe 来创建 RSA 密钥容器。这将把 RSA 密钥容器标识为用户级别的密钥容器。必须将 RSA 密钥容器标识为用户级别(使用 -pku 选项)或计算机级别(不使用 -pku 选项)。有关计算机级别和用户级别的 RSA 密钥容器的更多信息,请参见了解计算机级别和用户级别的 RSA 密钥容器。
打开命令提示。
为此,在 Microsoft Windows 中单击“开始”,再单击“运行”,在“打开”框中键入“cmd”,然后单击“确定”。
在命令提示处,通过键入以下命令将目录更改为 .NET Framework 2.0 版目录:
“cd \WINDOWS\Microsoft.Net\Framework\v2.0.*”
通过运行带有下列选项的 aspnet_regiis.exe 来创建计算机级别的新 RSA 密钥容器:
-pc 选项后跟 RSA 密钥容器的名称,用于创建 RSA 密钥对。
-exp 选项,用于确保密钥是可导出的。
下面的命令将创建 "MyKeys" 密钥容器。
aspnet_regiis -pc "MyKeys" -exp
请勿关闭“命令提示”窗口。
ASP.NET 应用程序的标识必须能读取用于加密和解密已加密节的加密密钥,才能对 Web.config 文件中的已加密信息进行解密。
打开文本编辑器,然后将下面的代码复制到一个新文件中。
<%@ Page Language="VB" %>
<%
Response.Write(System.Security.Principal.WindowsIdentity.GetCurrent().Name)
%>
<%@ Page Language="C#" %> <% Response.Write(System.Security.Principal.WindowsIdentity.GetCurrent().Name); %>
在应用程序目录中将该文件另存为 “identity.aspx”。
若要确定 ASP.NET 应用程序的标识,请在浏览器中打开 identity.aspx。
浏览器中将出现 ASP.NET 应用程序的模拟标识。
注意 |
---|
对于该演练,请不要对您的站点使用模拟身份验证。即只对该演练使用匿名身份验证作为 ASP.NET 应用程序的标识。对于该演练,如果应用程序的标识为目前登录的用户 ID(如 DOMAIN\userid),请在应用程序的 Web.config 文件中禁用模拟。若要禁用模拟,请编辑 Web.config 文件并移除 <identity> 元素。完成此更改后,请更新浏览器中的 identity.aspx 以显示修改后的应用程序标识。 |
在命令提示处,通过运行 aspnet_regiis.exe 使用下列选项授予标识对 RSA 密钥容器的访问权限:
-pa 选项后跟名为 "MyKeys" 的 RSA 密钥容器。
在前一步中确定的 ASP.NET 应用程序的标识。
例如,下面的命令授予 NETWORK SERVICE 帐户对计算机级别的 "MyKeys" RSA 密钥容器的访问权限。
aspnet_regiis -pa "MyKeys" "NT AUTHORITY\NETWORK SERVICE"
在这部分演练中,您将在 ASP.NET 应用程序的 Web.config 文件中指定“受保护配置”提供程序的实例。“受保护配置”提供程序的实例使用名为 "MyKeys" 的计算机级别 RSA 密钥容器,该实例是在上述过程中创建的。
打开文本编辑器,然后打开 ASP.NET 应用程序的 Web.config 文件。
如果 ASP.NET 应用程序没有 Web.config 文件,请打开文本编辑器,然后将示例配置复制到一个新文件中。在 ASP.NET 应用程序目录中,将文件另存为 web.config。
确保该配置包括 <connectionStrings> 元素,如下面的示例所示。
<configuration> <connectionStrings> <add name="SqlServices" connectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;" /> </connectionStrings> </configuration>
添加 <configProtectedData> 节,其中包括名为 "MyProvider" 的 RsaProtectedConfigurationProvider 类的实例,这个类使用名为 "MyKeys", 的计算机级别 RSA 密钥容器,如下面的示例所示。
<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>
保存并关闭 Web.config 文件。
既然已经指定使用 "MyKeys" RSA 密钥容器的 RsaProtectedConfigurationProvider 类的实例,并且 ASP.NET 应用程序的标识能够读取 "MyKeys",请使用 "MyKeys" 对 ASP.NET 应用程序的 Web.config 文件的节进行加密,然后 ASP.NET 在处理 Web.config 文件时会对文件的节进行解密。
在命令提示处,运行带有下列选项的 aspnet_regiis.exe:
-pe 选项,后跟 "connectionStrings",用于对应用程序的 Web.config 文件的 <connectionStrings> 元素进行加密。
-app 选项,用于标识应用程序的名称。
-prov 选项后跟 "MyProvider",用于标识在上述步骤中 Web.config 文件中指定的 RsaProtectedConfigurationProvider 提供程序。
例如,下面的命令将加密 MyApplication 应用程序的 Web.config 文件的 <connectionStrings> 节。
aspnet_regiis -pe "connectionStrings" -app "/MyApplication" -prov "MyProvider"
打开 Web.config 文件并查看已加密的内容。
内容与下面的示例 Web.config 文件类似。
<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>
关闭 Web.config 文件。
ASP.NET 在处理 Web.config 文件时会自动对该文件的内容进行解密。因此,不需要任何步骤即可对已加密的配置设置进行解密,供其他 ASP.NET 功能使用或用于访问代码中的值。但是,若要查看已解密的设置,您可以遵循下面的步骤操作。
打开文本编辑器,然后将下面的 ASP.NET 代码复制到一个新文件中。
<%@ Page Language="VB" %> <%@ Import Namespace="System.Configuration" %> <script runat="server"> Public Sub Page_Load() ConnectionStringsGrid.DataSource = ConfigurationManager.ConnectionStrings ConnectionStringsGrid.DataBind() End Sub </script> <html> <body> <form runat="server"> <asp:GridView runat="server" CellPadding="4" id="ConnectionStringsGrid" /> </form> </body> </html>
<%@ Page Language="C#" %> <%@ Import Namespace="System.Configuration" %> <script runat="server"> public void Page_Load() { ConnectionStringsGrid.DataSource = ConfigurationManager.ConnectionStrings; ConnectionStringsGrid.DataBind(); } </script> <html> <body> <form runat="server"> <asp:GridView runat="server" CellPadding="4" id="ConnectionStringsGrid" /> </form> </body> </html>
将该文件另存为 “walkthrough.aspx”,然后在浏览器中查看该文件。
您将看到加密的 Web.config 文件中已解密的值。
可以将 RSA 密钥容器导出到一个 XML 文件作为密钥值的备份副本,或者将密钥容器复制到其他 Web 服务器,这些服务器将承载包括已加密的 Web.config 文件的应用程序的副本。如果没有用于加密 Web.config 文件的特定 RSA 密钥容器,则 ASP.NET 将无法对已加密的配置值进行解密。
在命令提示处,运行带有下列选项的 aspnet_regiis.exe:
-px 选项后跟 "MyKeys",它是在本演练的前一部分“创建自定义的 RSA 密钥容器”中创建的 RSA 密钥容器的名称。
将密钥容器导出到的 .xml 文件的路径。
-pri 选项,用于确保已导出私钥信息。否则,导出的密钥信息只能对信息进行加密,而不能进行解密。
例如,下面的命令将名为 "MyKeys" 的计算机级别 RSA 密钥容器导出到名为 keys.xml 的 .xml 文件,该文件位于 C 驱动器的根目录下。
aspnet_regiis -px "MyKeys" "c:\keys.xml" -pri
注意 |
---|
为了确保没有人可以对已经用 RSA 密钥容器加密的 Web.config 文件进行解密,将 RSA 密钥容器导出到 .xml 文件后,请将 .xml 文件复制到 Web 服务器的外部位置,然后从 Web 服务器上删除该文件。 |
您现在具有使用已加密的 Web.config 文件将应用程序复制到独立 Web 服务器所需的所有信息。
如果要使用已加密的 Web.config 文件将应用程序复制到独立的 Web 服务器中,请转到步骤 4。
如果您没有第二台需要复制 Web 应用程序的 Web 服务器,并且要继续本演练,请完成下面的步骤从 Web 服务器中删除 RSA 密钥容器。然后,将这台 Web 服务器视为第二台 Web 服务器。
若要删除 RSA 密钥容器,请在命令提示处运行带有 -pz 开关的 aspnet_regiis.exe,后跟 "MyKeys"。
例如,下面的命令将删除 "MyKeys":
aspnet_regiis -pz "MyKeys"
转到步骤 5。
将包括已加密的 Web.config 文件的 Web 应用程序复制到另一台 Web 服务器。
如果您不确定如何将 Web 应用程序复制到第二台服务器,请将现有应用程序中的所有文件夹和内容复制到第二台 Web 服务器中,然后按照如何:在 IIS 中创建和配置虚拟目录中的步骤将应用程序标识为 Web 应用程序。
在第二台服务器上,打开命令提示窗口,然后输入以下命令将目录更改为 .NET Framework 2.0 版目录:
cd \WINDOWS\Microsoft.Net\Framework\v2.0.*
将包含已导出的 RSA 密钥容器的 .xml 文件复制到第二台 Web 服务器上的 .NET Framework 2.0 版的目录中。
在此演练中,将 keys.xml 文件复制到驱动器 C 的根目录下。
在第二台 Web 服务器的命令提示处,运行带有下列选项的 aspnet_regiis.exe:
-pi 选项,后跟已导出的密钥容器的名称 "MyKeys",用于导入 RSA 密钥容器。
包含已导出的密钥容器的 .xml 文件的路径
例如,下面的命令会导入名称为 "MyKeys" 的 RSA 密钥容器。
aspnet_regiis -pi "MyKeys" "c:\keys.xml"
在第二台 Web 服务器上,删除包含已导出的 RSA 密钥容器的 .xml 文件的副本。
在第二台 Web 服务器上,确定 ASP.NET 应用程序的标识,并按照本演练的前一部分“授予对 RSA 加密密钥的读取权限”中的步骤授予该标识对已导入的 RSA 密钥容器的访问权限。
在第二台 Web 服务器上,遵循上述部分中的步骤查看已加密 Web.config 文件中的已解密配置设置。