【问题标题】:ASP.NET Encryption - aspnet_regiis - FarmASP.NET 加密 - aspnet_regiis - 农场
【发布时间】:2011-12-21 08:53:24
【问题描述】:

我们的网站使用“NT Authority\Network Service”。

Response.Write(WindowsIdentity.GetCurrent().Name); 

我们目前正在使用以下命令来加密配置文件。

aspnet_regiis -pc "NetFrameworkConfigurationKey"
aspnet_regiis -pa "NetFrameworkConfigurationKey" "NT Authority\Network Service"
aspnet_regiis.exe -pef "connectionStrings" "C:\WebAppLocation\Folder"

注意:我们没有使用“-exp”。当我们使用“-exp”时,它不会创建 RSA Key Container。

如您所见,我们使用的是默认密钥 NetFrameworkConfigurationKey。我们的网站有一个负载均衡器。 Webserver1(W1) 和 WebServer2 (W2) 可用。

如果我遵循上述命令,我们将在 W1 和 W2 上使用单独的键。但是,该网站使用这种方法。

这种方法是否足够? 它有任何缺点或安全漏洞吗? 在任何情况下都会失败吗?

注意:机器密钥已添加到我们的 web.config 中。两种配置都是一样的。但是,我们的 configProtectedData 不在 Web.Config 中。另外,我认为两台服务器的 NetFrameworkConfigurationKey 会有所不同。

我已阅读以下有关 Web Farm 场景中的加密的 msdn 文章。 http://msdn.microsoft.com/en-us/library/ff650304.aspx

【问题讨论】:

    标签: c# asp.net .net encryption aspnet-regiis.exe


    【解决方案1】:

    我听上去不像你做的一切都是正确的。首先,这里有两个问题:

    1. 确保两个 Web 服务器上的 machineKey 相同。
    2. 确保在两台服务器的密钥容器中安装相同的 RSA 私钥,以便每台服务器都可以解密加密的配置。

    这些是单独的问题:ma​​chineKey 与加密/解密您要保护的配置部分无关。

    所以首先aspnet_regiis -pc 命令用于创建一个新的 RSA 密钥容器,它失败的原因是您指定的容器名称已经存在,因为它是默认值。此容器中的密钥对不可导出,因此您需要创建一个新的密钥容器并指定-exp 开关以表示该密钥对是可导出的。

    aspnet_regiis -pc "MyDeploymentKeyContainer" -exp
    

    然后将密钥导出到一个文件,包括私钥:私钥用于解密配置部分,因此 Web 服务器将需要它。

    aspnet_regiis -px "MyDeploymentKeyContainer" deploykey.xml -pri
    

    现在将配置部分添加到您的 web.config 并保存。

    <configProtectedData>
      <providers>
      <add keyContainerName="MyDeploymentKeyContainer" 
               useMachineContainer="true"
               description="Uses RsaCryptoServiceProvider to encrypt and decrypt"
               name="DeploymentProvider"
         type="System.Configuration.RsaProtectedConfigurationProvider,System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
      </providers>
    </configProtectedData>
    

    然后加密指定提供程序名称的 web.config 部分,如上所示(这里是“DeploymentProvider”)

    aspnet_regiis -pef "connectionStrings" "C:\WebAppLocation\Folder" -prov "DeploymentProvider"
    

    现在您需要将应用程序部署到两台服务器,并将之前导出的 RSA 密钥容器导入文件。复制文件并在每个服务器上运行:

    aspnet_regiis -pi deploykey.xml
    

    完成后,从服务器中删除文件 - 您不希望它挂起。最后,授予运行您的 Web 应用程序的应用程序池的用户帐户访问两个 Web 服务器上的密钥容器的权限。

    aspnet_regiis -pa "MyDeploymentKeyContainer" SomeDomain\SomeAccount
    

    【讨论】:

      【解决方案2】:

      您所做的一切都很好,但我也建议您将machinekey 放入machine.config 而不是web.config。此值通常不会经常更改,并且可以减少 web.config 更改时意外更改的可能性。

      这也将允许您扩展未来的应用程序,而不会弄乱越来越多的 web.config。

      【讨论】:

        【解决方案3】:

        我已经通过这种方式解决了这个问题:

        aspnet_regiis -pi "MyDeploymentKeyContainer" "c:\keys.xml"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-08-18
          • 2012-01-10
          • 1970-01-01
          • 2011-09-09
          • 2011-12-24
          • 2017-07-19
          • 2022-01-01
          • 2017-10-13
          相关资源
          最近更新 更多