2008-12-11 52 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開關來保護私鑰。