使用受 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的限制吗?