65.9K
CodeProject 正在变化。 阅读更多。
Home

如何使用 aspnet_regiis.exe 加密 Web.config(Framework 4+) 重点关注 Web 场

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.96/5 (13投票s)

2015 年 2 月 18 日

CPOL

5分钟阅读

viewsIcon

173697

本文档提供了关于如何使用 aspnet_regiis.exe 工具实现基本保护的基本参考,该工具默认随 .Net Framework 安装,并提供了一些在使用 IIS WebFarms 时的基本注意事项。

引言

虽然 web.config 文件是存储 基本 配置设置的首选位置,但通常您不会关心其中敏感信息的泄露。数据库连接字符串和第三方服务凭证等设置通常以纯文本形式存储,容易暴露给恶意用户。本文档提供了关于如何使用 aspnet_regiis.exe 工具实现基本保护的基本参考,该工具默认随 .Net Framework 安装,并提供了一些在使用 IIS WebFarms 时的基本注意事项。我将展示一个如何使用 RSA 提供程序的示例,但也有 DPAPI 提供程序可用,本文未涵盖。

加密提供程序

什么是加密提供程序 ?基本上,它是一个库,使您能够加密编码或声明性配置中的敏感数据。每个加密提供程序都有其优点和缺点。

aspnet_regiis.exe 的基本提供程序是 RsaProtectedConfigurationProvider,它使用 RSA 加密算法。(更多信息(http://en.wikipedia.org/wiki/RSA_%28cryptosystem%29

另外 也提供了 DPAPI 提供程序,它默认安装为操作系统内置组件。(更多信息 http://en.wikipedia.org/wiki/Data_Protection_API)

 使用 RSA 或 DPAPI

-prov “RsaProtectedConfigurationProvider”

此方法依赖于可以与其他多台计算机共享的私钥,这使其成为处理多个环境(如开发、测试和生产)的正确解决方案。另外,如果您需要处理拥有多个 IIS 服务器的 Web 场,并且这些服务器可能由 DFS(分布式文件系统)进行同步。

-prov “DataProtectionConfigurationProvider”

此方法依赖于您最初加密数据的计算机,例如,如果计算机 A 加密了“hello world”,只有计算机 A 拥有正确的密钥来解密它。这导致非 Web 场环境的解决方案不适用。

现在您已经知道适合您环境的提供程序了,让我们开始工作吧。

还记得 aspnet_regiis.exe 的位置吗?当然: C:\Windows\Microsoft.NET\Framework\v4.0.30319

因此,让我们打开一个命令提示符,例如“Developer Command Prompt for VS2013”,确保您拥有管理员权限。在服务器上,您可以使用 cmd.exe。

aspnet_regiis.exe -pef 命令(加密)

此命令加密特定硬盘位置中的特定节。例如,要加密位于“C:\inetpub\wwwroot\app\WebConfigEncryption”的站点的“appSettings”节,请运行

aspnet_regiis.exe -pef appSettings  C:\inetpub\wwwroot\app\WebConfigEncryption

要加密“connectionStrings”节,请运行

aspnet_regiis.exe -pef connectionStrings  C:\inetpub\wwwroot\app\WebConfigEncryption

重要!!! 节名称区分大小写,并且请务必在不带“”的情况下指定路径。

这是加密了两个节后的结果文件

正如我所说,RSA 提供程序默认依赖于可以与其他多台计算机共享的密钥,但这不是默认行为,因此我无法与机器 B 共享在机器 A 上加密的文件。我会收到类似以下的错误:

同样,我无法在机器 B 上解密任何数据

为了在多台计算机之间共享加密文件,请参阅以下部分。

处理 Web 场所需的步骤

在单机环境中使用可能不会很棘手,但 Web 场可能需要更多关注。如果您使用过 DFS(分布式文件系统),其中应用程序文件会自动复制到多台计算机(包括 .config 文件),那么基本解决方案将不适用。

这时 密钥容器 就派上用场了。

密钥容器可以表示为一个 XML 文件,其中包含可用于在多台服务器上加密/解密数据的必需密钥。一个密钥容器可以被多个应用程序使用,但为了提高应用程序敏感配置的安全性,您可以使用多个密钥容器,通过这样做,一个应用程序的密钥容器将无法用于解密用另一个密钥容器加密的 web.config 文件。

步骤 1:创建 RSA 容器

Aspnet_regiis.exe -pc “myApp1SampleKeys” -exp

此命令需要 3 个参数

  1. -pc :我想创建一个 RSA 公钥/私钥容器。
  2. “name” :在 web.config 文件中使用的密钥容器名称。
  3. -exp: 允许容器导出。

步骤 2:授予对 RSA 密钥容器的访问权限

aspnet_regiis -pa “myApp1SampleKeys” “NT AUTHORITY\NETWORK SERVICE”

此命令需要 3 个参数

  1. -pa:我想授予对我的密钥容器的访问权限。
  2. “name” :密钥容器的名称。
  3. “account”:被授予访问权限的帐户名称。

步骤 3:更新应用程序的 web.config 文件以指定自定义提供程序

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

请务必检查这两个值

  1. 提供程序名称“customProvider”
  2. KeyContainerName“myApp1SampleKeys”

步骤 4:使用我们新的自定义提供程序加密应用程序节

aspnet_regiis.exe -pef appSettings C:\inetpub\wwwroot\app\WebConfigEncryption -prov “customProvider”

这将是结果

步骤 5:导出密钥容器以便在其他计算机上使用

aspnet_regiis -px “myApp1SampleKeys” c:\myApp1SampleKeys.xml -pri

此命令需要 4 个参数

  1. -px:我想导出我的密钥容器。
  2. “name” :密钥容器的名称。
  3. “path”:将创建 xml 文件的路径。
  4. -pri:也包括私钥。

步骤 6:在另一台计算机上导入密钥容器

aspnet_regiis -pi “myApp1SampleKeys” c:\myApp1SampleKeys.xml

此命令需要 3 个参数

  1. -pi:我想导入一个密钥容器。
  2. “name” :密钥容器的名称。
  3. “path”:将读取 xml 文件的路径。

步骤 7:授予对我们新的 RSA 密钥容器的访问权限

aspnet_regiis -pa “myApp1SampleKeys” “NT AUTHORITY\NETWORK SERVICE”

读取密钥容器所必需。

步骤 8:从服务器中删除 XML 文件

不要让攻击者找到带有密钥的 XML。

aspnet_regiis.exe -pdf 命令(解密)

最后一个有用的命令是 -pdf,它允许我们解密任何先前加密的节。

aspnet_regiis.exe -pdf appSettings C:\inetpub\wwwroot\app\WebConfigEncryption

此命令需要 3 个参数

    1. -pdf:我想解密一个值。
    2. “name” :包含加密值的密钥节的名称。
    3. path:web.config 文件的路径。

在源代码中访问加密值

加密值可以在运行时像未编码一样读取,请记住,在应用程序运行时,可以从内存中读取加密数据,因此您可能需要使用特殊的字符串,例如 SecureString 类(https://msdn.microsoft.com/en-us/library/system.security.securestring%28v=vs.110%29.aspx)。

总而言之,尽可能安全地保管 web.config 中包含的设置,应该是发布和配置管理策略中的主要关注点之一。

历史

2015/02/17:首次发布

© . All rights reserved.