0

我已经尝试了很长一段时间来弄清楚如何加密存储在名为 dev_entlib.config 的外部文件中的应用程序块

我可以在 entlib (4.1) 中看到可以使用默认保护提供程序来加密块,但是,我确实需要在不同的服务器上部署这个应用程序,因此我需要将用于加密应用程序块的 keyProvider 导出到那些服务器。

到目前为止,我所做的是将自定义受保护的配置提供程序添加到 .net v2.0* 任何文件夹(以及所有目标服务器)中的 machine.config 文件中

自定义提供者是这样的

<add name="MyCompanyProvider" 
    type="System.Configuration.RsaProtectedConfigurationProvider, 
          System.Configuration, Version=2.0.0.0, Culture=neutral, 
          PublicKeyToken=b03f5f7f11d50a3a,
         processorArchitecture=MSIL"
    keyContainerName="MyKey" 
    useMachineContainer="true" />

它很好地位于其他默认提供程序旁边,甚至在 Entlib 配置工具中具有设计时支持。然后,我为要加密的每个块选择保护提供程序。

查看 dev_entlib.config,表明该块确实是用我的提供者加密的。我的提供者使用我的密钥容器。因此,应该使用我的密钥容器对块进行加密。然后我使用以下方法将“MyKey”导出到 xml 文件:

c:\Windows\Microsoft.NET\Framework\v2.0.50727>aspnet_regiis.exe -px "MyKey" "C:\keys.xml" -pri
Exporting RSA Keys to file...
Succeeded!

然后将此密钥文件复制到我的 sysTest 服务器,并在该服务器中导入并授予“NT Authority\Network Services”和“ASPNET”访问权限

然后我复制我的加密 web.config 和 dev_entlib.config 并尝试在一个小页面中显示连接字符串,该页面使用 .net ConfigurationManager 获取 ConnectionStrings 集合并将它们显示在页面上。此页面在 IIS 下运行,进程标识为“NT Authority\Network Services”。

问题是,它不起作用!存在错误数据错误或“无法使用提供程序 MyCompanyProvider 解密”。

这种方法对我来说似乎合乎逻辑,但它仍然失败。

有人有其他建议吗?

4

2 回答 2

1

使用企业库配置工具,使用您的自定义 RSA 密钥容器加密外部企业库配置文件。

  • EntLib (4.1) 使用默认保护提供程序RsaProtectedConfigurationProvider。但是可以在您的配置文件中删除此提供程序并将其替换为您自己的同名提供程序,然后可以指向您的自定义密钥提供程序:“ MyKey ”。
  • 您应该将这个configProtectedData部分添加到具有您要加密的区域的配置文件中(例如,您的外部文件:*dev_entlib.config*)。您根本不需要修改machine.config文件。
  • 然后,您可以从企业库配置应用程序中为数据访问应用程序块保护提供程序选择RsaProtectedConfigurationProvider 。
  • 如果您使用的是 Vista、Windows 7、Windows 2008,则必须 使用以管理员身份运行打开此EntLibConfig.exe 。
    • 否则会报错:
      • Failed to encrypt the section 'connectionStrings' using provider 'RsaProtectedConfigurationProvider'. Error message from the provider: Object already exists.
  • 然后,您可以将此加密的 *dev_entlib.config* 与web.config配置文件一起复制到您的sysTest服务器。在该sysTest服务器上使用 Enterprise Library Configuration 工具打开web.config文件不应出现错误:
    • Failed to decrypt using provider 'RsaProtectedConfigurationProvider'. Error message from the provider: Bad Data.

网络配置

这个文件几乎是空的,只是指向外部数据配置文件:

<!-- web.config -->
<configuration>
  <configSections>
    <section name="enterpriseLibrary.ConfigurationSource" type="Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ConfigurationSourceSection, Microsoft.Practices.EnterpriseLibrary.Common, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
  </configSections>
  <enterpriseLibrary.ConfigurationSource selectedSource="External Data Configuration File Source">
    <sources>
      <add name="External Data Configuration File Source" type="Microsoft.Practices.EnterpriseLibrary.Common.Configuration.FileConfigurationSource, Microsoft.Practices.EnterpriseLibrary.Common, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        filePath="dev_entlib.config" />
    </sources>
  </enterpriseLibrary.ConfigurationSource>
</configuration>

dev_entlib.config

此文件具有连接字符串和应使用以下加密的保护提供程序:

<!-- dev_entlib.config -->
<configuration>
    <configSections>
        <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
 </configSections>
    <dataConfiguration defaultDatabase="MyConnectionStringName" />
 <connectionStrings>
  <add name="cnHnicMediaLibrary" connectionString="Server=MyDbServer; Database=MyDbName; Integrated Security=SSPI"
   providerName="System.Data.SqlClient" />
 </connectionStrings>
  <configProtectedData>
    <providers>
      <remove name="RsaProtectedConfigurationProvider" />
      <add    name="RsaProtectedConfigurationProvider"
        keyContainerName="MyKey"
        useMachineContainer="true"
        description="Uses our own encryption key container so that it will work in a Web Farm setting. We need to trick Enterprise Library, which wants to use the default RsaCryptoServiceProvider to encrypt and decrypt, by replacing this default provider with our own while this configuration is processed!"
        type="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    </providers>
  </configProtectedData>
</configuration>

基于:

我希望这描述了您收到的错误消息以及如何修复它。

于 2011-11-09T00:22:58.443 回答
0

这似乎还不可能。我的解决方案是将块加密为 web.config 的一部分,然后将这些块复制并粘贴到外部 entLib.config 文件中。然后应该能够使用导出的密钥在目标服务器上解密这些块。

于 2009-01-29T12:03:50.963 回答