ASP.NET受保护的配置-如何仅使用公钥进行加密?

ASP.NET受保护的配置-如何仅使用公钥进行加密?,asp.net,configuration,encryption,asp.net-2.0,Asp.net,Configuration,Encryption,Asp.net 2.0,使用ASP.NET保护配置时,如何仅使用公钥加密配置 我可以导出公钥文件。然后,我想使用此公钥加密另一台服务器上的配置文件,以便以后部署。但是,我不知道如何让aspnet_regis使用导出的公钥 REM export key \WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -px "MyKeys" "publicKey.xml" -pri 基本上,我尝试只将公钥导入容器,然后对其进行加密。但是,当我这样做时,它不会使用现有的

使用ASP.NET保护配置时,如何仅使用公钥加密配置

我可以导出公钥文件。然后,我想使用此公钥加密另一台服务器上的配置文件,以便以后部署。但是,我不知道如何让aspnet_regis使用导出的公钥

REM export key
\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -px "MyKeys" "publicKey.xml" -pri
基本上,我尝试只将公钥导入容器,然后对其进行加密。但是,当我这样做时,它不会使用现有的密钥进行加密,而是创建一个全新的密钥对,覆盖现有的公钥。在下面的脚本中,如果将每个复制的文件重命名回connections.config,并尝试解密它们,第一个文件(connectionstring_server.encrypted)将失败,而第二个文件(connectionstring_build.encrypted)将成功),证明创建了新的密钥对

下面是一个批处理文件,演示了我尝试过的方法(编辑:这只是一个测试aspnet_regiis功能的示例。显然,我对它的实际使用略有不同):

下面是一个示例web.config

<?xml version="1.0"?>
<configuration>
    <configProtectedData>
        <providers>
            <add name="MyProvider" keyContainerName="MyKeys" type="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" useMachineContainer="true" />
        </providers>
    </configProtectedData>
  <connectionStrings configSource="connections.config" />
</configuration>

以及相应的connections.config:

<connectionStrings>
  <add name="SomConnectionName" connectionString="Data Source=somedatasource; Initial Catalog=somedatabase; Integrated Security=SSPI; Persist Security Info=False;" providerName="System.Data.SqlClient" />
</connectionStrings>

编辑:
下面的答案建议我也可以导出私钥。这确实允许加密工作,但我不需要私钥来加密。我要做的是将私钥保留在将使用配置文件的服务器上,并将公钥存储在更容易访问的位置。无法这样做仅仅是aspnet_regis的一个限制吗?

我认为您的问题在于export命令,当您导出时,您需要指定-pri参数来告诉aspnet_regis您想要导出私钥和公钥

REM export key
\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -px "MyKeys" "publicKey.xml" -pri
如果没有私钥,您的导入仍在创建自己的密钥对。这可能是Microsoft的错误,aspnet_regiis至少应该警告您,它无法导入您的不完整密钥,而是创建了一个新密钥


仅导出公钥可能很有用,然后您可以将xml文件提供给您的操作或开发组,这样他们就可以在配置文件部署到服务器之前对其进行加密,而不必泄露私钥。另外,这样您就不需要在服务器场中的每台服务器上运行加密过程。

我不知道这是否是一个bug,但我肯定也遇到了这个问题。公钥和私钥需要导入到Windows密钥存储中,才能使任何.net函数正常工作。但是,可以通过在导入密钥时不指定-exp开关来保护私钥。

Right。exp开关是从Xml文件导入RSA密钥对的aspnet_regiis开关的可选添加。