使用可导出的密钥提供程序加密外部存储的App块

时间:2008-12-19 11:46:43

标签: encryption enterprise-library aspnet-regiis.exe

我已经尝试了很长时间来弄清楚如何加密存储在名为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无法解密”。

这种方法对我来说似乎有道理,但它仍然失败。

有没有人有其他建议?

2 个答案:

答案 0 :(得分:1)

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

  • EntLib(4.1)使用默认保护提供程序 RsaProtectedConfigurationProvider 。但是可以在配置文件中删除此提供程序,并将其替换为您自己的同名,然后可以指向您的自定义密钥提供程序:“ MyKey ”。
  • 您应该在配置文件中添加此 configProtectedData 部分,该部分包含您要加密的区域(例如您的外部文件:* dev_entlib.config *)。您根本不需要修改 machine.config 文件。
  • 然后,您可以从企业库配置应用程序中为数据访问应用程序块 ProtectionProvider选择 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

此文件非常空,只指向外部数据配置文件:

<!-- 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>

基于:

我希望这描述了您的错误消息以及如何解决它。

答案 1 :(得分:0)

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