15

I am attempting to encrypt connection string values in the Web.Config file for an ASP.NET 2.0 web application, following the procedure described on MSDN. Using the RsaProtectedConfigurationProvider, I created and exported a machine-level key on my development machine (using the -pri flag), and imported the key and granted access on the web server. Prior to testing automatic decryption by ASP.NET, I wanted to try manually decrypting the Web.Config.

I am able to manually encrypt and decrypt the Web.Config on the same machine using the -pef and -pdf parameters respectively, but manually decrypting on the web server fails with a Bad Data error message.

The oddest thing is that the keyContainerName attribute in my Web.Config file seems to be ignored. If I try replacing the correct value with gibberish (no longer corresponding to any key container I have created) the encryption and decryption still work on my development machine. Any ideas?

4

7 回答 7

7

根据您的描述,您遇到了一些关于通过可导出 RSA 提供程序加密 web.config 的问题,对吗?

根据 RSA 加密参考,我进行了一些本地测试,通过 RSA 提供程序加密 web.config 部分并移动到其他机器的正常过程如下:

======================= 步骤1

创建机器级 RSA 密钥容器:aspnet_regiis -pc "MyTestKeys" -exp

第2步

授予对 RSA 加密密钥的读取访问权限:

aspnet_regiis -pa "MyTestKeys" "NT AUTHORITY\NETWORK SERVICE"

第 3 步

加密配置文件:aspnet_regiis -pef "connectionStrings" "网站文件夹的物理路径" -prov MyRSAProvider

使用以下步骤导出容器并将其导入回其他机器

第4步

导出机器级 RSA 密钥容器:aspnet_regiis -px "MyTestKeys" "c:\Config-Key.xml" -pri

第 5 步

将 Config-Key.xml 复制到第二台服务器上的 c:\

第 6 步

在第二台服务器上导入机器级 RSA 密钥容器:aspnet_regiis -pi "MyTestKeys" "c:\Config-Key.xml"

第 7 步

授予对 RSA 加密密钥的读取访问权限:aspnet_regiis -pa "MyTestKeys" "NT AUTHORITY\NETWORK SERVICE"

第 8 步

将加密的 web.config 复制到第二台服务器

=========================

根据您提到的步骤,我认为您遵循的大部分过程应该是正确的。到目前为止,我建议您检查以下内容:

  1. 检查您的自定义 RSA 提供程序设置以查看它是否也正确复制到目标机器并设置为使用机器容器

========加密配置部分=======

type="System.Configuration.RsaProtectedConfigurationProvider,System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />

  1. 如在上述步骤中,创建 RSA 密钥容器后,您需要使用“aspnet_regiis -pa”确保特定帐户(将运行您的 ASP.NET 应用程序)对密钥容器具有足够的访问权限。通常,当您使用 VS 2008/VS 2005 测试服务器运行 ASP.NET 应用程序时,您使用的是登录用户(可能是管理员),但是,如果您在 IIS 中运行 ASP.NET(或移至其他使用另一个不同进程帐户的服务器),您需要确保某个进程帐户已被授予权限。

您可以检查它们以查看问题是否是由于其中一些引起的。

此致 桑杰·曼朱·苏曼

于 2010-01-30T09:43:24.587 回答
1

Bad Data当我在手动解密时出错时,我遵循了下面列出的方法。

  1. 在. Remove_ Clear_configProtectedData
  2. –pri导出密钥时使用了验证
  3. 还要确保 keyContainerName 与用于注册的相同

keyContainerName="MyKeys"

配置

<configProtectedData>
  <providers>

    <clear/>

<remove name="RSAProtectedConfigurationProvider" />

     <add name="RSAProtectedConfigurationProvider" keyContainerName="MyKeys" 
    type="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0.0.0,&#xD;&#xA;                
Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a,&#xD;&#xA; processorArchitecture=MSIL"
          useMachineContainer="true" />

  </providers>
</configProtectedData>

参考

  1. 连接字符串加密
  2. RAS 密钥在哪里...
于 2013-05-31T16:14:03.037 回答
1

请注意,要加密的元素的名称区分大小写。所以你应该使用“connectionStrings”而不是“connectionstrings”或“ConnectionStrings”。

于 2010-02-01T09:37:08.523 回答
0

正如 mahdi 所说,加密对大小写非常敏感。我在我的电脑上使用过并将它带到服务器上我遇到了问题,问题来自存储在我的电脑文件夹或目录中的 RSA 机器密钥容器。如果您想知道在进行任何更改之前可以从哪里开始更正,请从

\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys.

有关信息,请参考此链接,这可能会有所帮助....

http://msdn.microsoft.com/en-us/library/ms998283.aspx

于 2010-02-02T17:41:53.580 回答
0

RsaProtectedConfigurationProvider 使用机器帐户或用户帐户对密钥进行加密并将其保存在一个名为“密钥容器”的文件中,该文件通常保存在 C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA 中。并且 ASP.NET 工作进程标识(XP/2000 中的 ASPNET 用户或 2003 中的网络服务)应该有权访问这些文件以便能够对其进行解密,否则您将收到此错误消息。

请检查此链接以获取更多信息

http://msdn.microsoft.com/en-us/library/dtkwfdky.aspx

于 2010-01-30T09:37:27.550 回答
0

实际上,您可以使用 Microsoft 的 EL 来加密您的连接字符串。你可以在这里下载:http: //www.codeplex.com/entlib

hth

于 2009-12-28T08:44:20.707 回答
0

这是加密和解密连接字符串的另一种方法,如果您使用的是 vs2010,请检查它,然后以管理员身份运行打开 vs2010

string provider = "RSAProtectedConfigurationProvider";

string section = "connectionStrings"; 

protected void btnEncrypt_Click(object sender, EventArgs e) 

{

   Configuration confg =
   WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);

   ConfigurationSection configSect = confg.GetSection(section);

   if (configSect != null)

   {
      configSect.SectionInformation.ProtectSection(provider);
      confg.Save();

   }

}
protected void btnDecrypt_Click(object sender, EventArgs e)
{
    Configuration config =
        WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
    ConfigurationSection configSect = config.GetSection(section);
    if (configSect.SectionInformation.IsProtected)
    {
        configSect.SectionInformation.UnprotectSection();
        config.Save();
    }
}
于 2012-05-08T11:25:36.000 回答