2008-12-11 91 views
0

使用ASP.NET保护配置时,如何使用公钥加密配置?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的限制吗?

回答

1

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

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

没有私钥,导入仍然创建自己的密钥对。这可能是一个微软的bug,aspnet_regiis应该至少警告你,它不能导入你的不完整的密钥,并且它会取代一个新的密钥...

只导出公钥可能是有用的,那么你可以为您的操作或开发组提供xml文件,并且可以在配置文件部署到服务器之前对其进行加密,而不必泄露私钥。而且,这样您就不需要在服务器场中的每台服务器上运行加密过程。

0

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