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

时间:2008-12-11 04:28:28

标签: asp.net configuration encryption asp.net-2.0

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

我可以导出公钥文件。我想使用此公钥加密另一台服务器上的配置文件,以便以后部署。但是,我无法弄清楚如何让aspnet_regiis使用导出的公钥。

基本上,我尝试将公钥只导入容器,然后对其进行加密。但是,当我这样做时,它不是使用现有密钥进行加密,而是创建一个全新的密钥对,覆盖现有的公钥。在下面的脚本中,如果您将每个复制的文件重命名为connections.config,并尝试解密它们,第一个(connectionstring_server.encrypted)将失败,而第二个(connectionstring_build.encrypted)将成功),证明创建了一个新的密钥对。

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

REM delete container in case it already exists
\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -pz "MyKeys"

REM create container
\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -pc "MyKeys"

REM export key
\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -px "MyKeys" "publicKey.xml"

REM encrypt file
\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -pef "connectionStrings" . -prov "MyProvider"

REM copy encrypted file for later comparison
copy connections.config connectionstring_server.encrypted
pause

REM decrypt file
\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -pdf "connectionStrings" .

REM delete continer
\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -pz "MyKeys"

REM import public key
\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -pi "MyKeys" publicKey.xml

REM encrypt file with just public key - THIS DOES NOT WORK CORRECTLY, it creates a new keypair
\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -pef "connectionStrings" . -prov "MyProvider"

REM copy back encrypted file
copy connections.config connectionstring_build.encrypted
pause

REM decrypt file
\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -pdf "connectionStrings" .

这是一个示例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_regiis?

2 个答案:

答案 0 :(得分:1)

我认为您的问题出在导出命令中,导出时需要指定-pri参数告诉aspnet_regiis您要导出私钥以及公钥。

REM export key
\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -px "MyKeys" "publicKey.xml" -pri

如果没有私钥,您的导入仍然会创建自己的密钥对。这可能是微软的一个错误,aspnet_regiis至少应警告你,它无法导入你的不完整的密钥,而是它改成了一个新密钥...

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

答案 1 :(得分:0)

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