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






4.96/5 (13投票s)
本文档提供了关于如何使用 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 个参数
- -pc :我想创建一个 RSA 公钥/私钥容器。
- “name” :在 web.config 文件中使用的密钥容器名称。
- -exp: 允许容器导出。
步骤 2:授予对 RSA 密钥容器的访问权限
aspnet_regiis -pa “myApp1SampleKeys” “NT AUTHORITY\NETWORK SERVICE”
此命令需要 3 个参数
- -pa:我想授予对我的密钥容器的访问权限。
- “name” :密钥容器的名称。
- “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>
请务必检查这两个值
- 提供程序名称“customProvider”
- 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 个参数
- -px:我想导出我的密钥容器。
- “name” :密钥容器的名称。
- “path”:将创建 xml 文件的路径。
- -pri:也包括私钥。
步骤 6:在另一台计算机上导入密钥容器
aspnet_regiis -pi “myApp1SampleKeys” c:\myApp1SampleKeys.xml
此命令需要 3 个参数
- -pi:我想导入一个密钥容器。
- “name” :密钥容器的名称。
- “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 个参数
-
- -pdf:我想解密一个值。
- “name” :包含加密值的密钥节的名称。
- path:web.config 文件的路径。
在源代码中访问加密值
加密值可以在运行时像未编码一样读取,请记住,在应用程序运行时,可以从内存中读取加密数据,因此您可能需要使用特殊的字符串,例如 SecureString 类(https://msdn.microsoft.com/en-us/library/system.security.securestring%28v=vs.110%29.aspx)。
总而言之,尽可能安全地保管 web.config 中包含的设置,应该是发布和配置管理策略中的主要关注点之一。
历史
2015/02/17:首次发布