ASP.NET加密 - aspnet_regiis - Farm

时间:2011-11-03 16:46:42

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

我们的网站使用“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密钥容器。

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

如果我按照上面提到的命令,我们将在W1和W2上使用单独的键。然而,该网站使用这种方法。

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

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

我已经在Web场景中阅读了以下用于加密的msdn aricle。 http://msdn.microsoft.com/en-us/library/ff650304.aspx

3 个答案:

答案 0 :(得分:8)

我听起来并不像你已经完成了所有事情。首先,这里有两个问题:

  1. 确保两个Web服务器上的machineKey相同。
  2. 确保在两台服务器上的密钥容器中安装相同的RSA私钥,以便每个服务器可以解密加密的配置。
  3. 这些是另外一个问题: machineKey与加密/解密您要保护的配置部分无关。

    首先,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
    

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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