逐步解說:使用受保護的組態加密組態資訊
更新:2007 年 11 月
提供加密 ASP.NET 應用程式之組態檔區段的逐步範例。
「受保護的組態」讓您加密儲存在 Web.config 檔中的敏感性資訊,有助於改善應用程式的安全性。您可以使用 aspnet_regiis.exe 加密 Web.config 檔的區段,以及管理加密金鑰。ASP.NET 會在處理組態檔時解密該檔案。因此,解密並不需要任何額外的程式碼。如需「受保護的組態」的詳細資訊,請參閱使用受保護的組態加密組態資訊。
在瀏覽這份逐步解說期間,您將了解如何執行下列作業:
使用預設受保護的組態提供者 (Provider),加密 Web.config 檔的區段。
存取 ASP.NET Web 網頁中解密的組態資訊。
必要條件
若要完成這個逐步解說,您必須進行下列步驟:
在要裝載 (Host) 網站的電腦上安裝並設定 Microsoft Internet Information Services (IIS)。
如需如何安裝和設定 IIS 的詳細資訊,請參閱 IIS 安裝隨附的線上說明,或前往 Internet Information Services (IIS) 6.0 Technical Resources。
ASP.NET 網站。
如果您已經有網站,則可使用該網站。否則,如需如何建立虛擬目錄或網站的詳細資訊,請參閱 HOW TO:在 IIS 5.0 和 6.0 中建立和設定虛擬目錄。
授與 RSA 加密金鑰讀取權限
在 ASP.NET 可以解密 Web.config 檔中的加密資訊之前,ASP.NET 應用程式的識別 (Identity) 必須具有用來加密和解密加密之區段的加密金鑰存取權限。這個逐步解說會使用預設 RsaProtectedConfigurationProvider 提供者,這個提供者是在 Machine.config 檔中指定,且命名為 "RsaProtectedConfigurationProvider"。預設 RsaProtectedConfigurationProvider 提供者所使用之 RSA 金鑰容器 (Container) 的名稱為 "NetFrameworkConfigurationKey"。
若要授與 ASP.NET 識別預設 RSA 金鑰容器的讀取權限
開啟文字編輯器,然後將下列程式碼複製到新檔案中。
<%@ Page Language="VB" %> <% Response.Write(System.Security.Principal.WindowsIdentity.GetCurrent().Name) %>
<%@ Page Language="C#" %> <% Response.Write(System.Security.Principal.WindowsIdentity.GetCurrent().Name); %>
將檔案以下列名稱儲存在應用程式目錄中:identity.aspx。
若要判斷 ASP.NET 應用程式的識別,請用瀏覽器開啟 identity.aspx。
ASP.NET 應用程式的模擬識別會顯示在瀏覽器中。
注意事項: 因為這個逐步解說是使用 IIS,所以不要使用模擬進行網站的驗證 (Authentication)。也就是說,針對這個逐步解說,只會使用匿名驗證做為 ASP.NET 應用程式的識別。如果應用程式的識別是應用程式之 Web.config 檔中目前登入的使用者 ID (User ID) (如 DOMAIN\myuserid),請停用模擬。若要停用 Web.config 檔中的模擬,請開啟 Web.config 檔,然後移除 <identity> 項目。移除 <identity> 項目之後,請在瀏覽器中更新 identity.aspx,以顯示應用程式的已修改識別。
在命令提示字元中,使用下列選項執行 aspnet_regiis.exe:
-pa 選項,後接有預設 RsaProtectedConfigurationProvider 的 RSA 金鑰容器名稱。
ASP.Net 應用程式識別,如之前的步驟中所判定。
例如,下列命令會將 NETWORK SERVICE 帳戶存取權授與電腦層級 "NetFrameworkConfigurationKey" RSA 金鑰容器。
注意事項: 在執行 Microsoft Windows Server 2003 且已於 Web.config 檔案中停用 ASP.NET 應用程式模擬的電腦上,應用程式的識別便是應用程式集區的識別。依照預設,這是指 NETWORK SERVICE 帳戶 (在舊版 Windows 上,識別為本機 ASPNET 帳庫)。
aspnet_regiis -pa "NetFrameworkConfigurationKey" "NT AUTHORITY\NETWORK SERVICE"
請勿關閉 [命令提示字元] 視窗。
加密 Web.config 檔案的區段
現在,ASP.NET 應用程式的識別具有預設 RsaProtectedConfigurationProvider 物件之 RSA 金鑰容器的讀取存取權,而使用該金鑰容器,會加密 ASP.NET 應用程式之 Web.config 檔的區段。然後,ASP.NET 會在處理 Web.config 檔時解密區段。
若要加密 Web.config 檔的 <connectionStrings> 和 <machineKey> 區段
在文字編輯器中,開啟應用程式的 Web.config 檔。
- 如果沒有 ASP.NET 應用程式的 Web.config 檔,請開啟文字編輯器,將範例組態複製到新檔案中,然後將檔案以下列名稱儲存在 ASP.NET 應用程式目錄中:web.config。
確定具有 <system.web> 項目的 <connectionStrings> 子項目和 <machineKey> 子項目 (如下列範例所示)。
<configuration> <connectionStrings> <add name="SqlServices" connectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;" /> </connectionStrings> <system.web> <machineKey validationKey="D61B3C89CB33A2F1422FF158AFF7320E8DB8CB5CDA1742572A487D94018787EF42682B202B746511891C1BAF47F8D25C07F6C39A104696DB51F17C529AD3CABE" decryptionKey="FBF50941F22D6A3B229EA593F24C41203DA6837F1122EF17" /> </system.web> </configuration>
關閉 Web.config 檔。
在命令提示字元中,輸入下列命令,將目錄變更為 .NET Framework 2.0 版目錄:
cd \WINDOWS\Microsoft.Net\Framework\v2.0.*
在命令提示字元中,使用下列選項執行 aspnet_regiis.exe:
-pe 選項和 "connectionStrings" 字串,用以加密應用程式之 Web.config 檔的 connectionStrings 項目。
-app 選項和應用程式名稱。
例如,下列命令會加密名為 MyApplication 之應用程式 Web.config 檔的 <connectionStrings> 區段。
aspnet_regiis -pe "connectionStrings" -app "/MyApplication"
針對 <system.web> 項目的 <machineKey> 子項目,重複前一個步驟 (如下列範例所示)。
aspnet_regiis -pe "system.web/machineKey" -app "/MyApplication"
請勿關閉 [命令提示字元] 視窗。
開啟 Web.config,然後檢視加密的內容。
內容與下列 Web.config 檔範例類似。
<configuration> <connectionStrings configProtectionProvider="RsaProtectedConfigurationProvider"> <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element" xmlns="http://www.w3.org/2001/04/xmlenc#"> <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" /> <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#"> <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" /> <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> <KeyName>RSA Key </KeyName> </KeyInfo> <CipherData> <CipherValue>WcFEbDX8VyLfAsVK8g6hZVAG1674ZFc1kWH0BoazgOwdBfinhcAmQmnIn0oHtZ5tO2EXGl+dyh10giEmO9NemH4YZk+iMIln+ItcEay9CGWMXSen9UQLpcQHQqMJErZiPK4qPZaRWwqckLqriCl9X8x9OE7jKIsO2Ibapwj+1Jo= </CipherValue> </CipherData> </EncryptedKey> </KeyInfo> <CipherData> <CipherValue>OpWQgQbq2wBZEGYAeV8WF82yz6q5WNFIj3rcuQ8gT0MP97aO9SHIZWwNggSEi2Ywi4oMaHX9p0NaJXG76aoMR9L/WasAxEwzQz3fexFgFSrGPful/5txSPTAGcqUb1PEBVlB9CA71UXIGVCPTiwF7zYDu8sSHhWa0fNXqVHHdLQYy1DfhXS3cO61vW5e/KYmKOGA4mjqT0VZaXgb9tVeGBDhjPh5ZlrLMNfYSozeJ+m2Lsm7hnF6VvFm3fFMXa6+h0JTHeCXBdmzg/vQb0u3oejSGzB4ly+V9O0T4Yxkwn9KVDW58PHOeRT2//3iZfJfWV2NZ4e6vj4Byjf81o3JVNgRjmm9hr9blVbbT3Q8/j5zJ+TElCn6zPHvnuB70iG2KPJXqAj2GBzBk6cHq+WNebOQNWIb7dTPumuZK0yW1XDZ5gkfBuqgn8hmosTE7mCvieP9rgATf6qgLgdA6zYyVV6WDjo1qbCV807lczxa3bF5KzKaVUSq5FS1SpdZKAE6/kkr0Ps++CE= </CipherValue> </CipherData> </EncryptedData> </connectionStrings> <system.web> <machineKey configProtectionProvider="RsaProtectedConfigurationProvider"> <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element" xmlns="http://www.w3.org/2001/04/xmlenc#"> <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" /> <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#"> <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" /> <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> <KeyName>RSA Key </KeyName> </KeyInfo> <CipherData> <CipherValue>IwUopItbWX0mJdGWtAqE1LlsG3u5RBRlAXs9/GZj3HEfeUXduHVF76q6Ip88YqlfLthH+DMBYdOZAF+hCOmS2agfTo1tKUvELRGIljS/BqEYxUO+/IOz9tllAw8ZlGF7AVCzptgIejI+iLXEZfMKW7f6EMGeb5vaaKXHIkYZwcM= </CipherValue> </CipherData> </EncryptedKey> </KeyInfo> <CipherData> <CipherValue>ivVyERVPNUzIb/i7/NUbRkxsxh8IG959vycwrzJO0vYWxHZ5i03SfrLbsGUV17+FxZ6lbcrVaF5FY3zVm7dRMRvQpVFwaVcL </CipherValue> </CipherData> </EncryptedData> </machineKey> </system.web> </configuration>
關閉 Web.config 檔。
存取解密的組態設定
ASP.NET 在處理 Web.config 檔時,會自動解密該檔案的內容。因此,並不需要任何額外步驟來解密已加密的組態設定,以供其他 ASP.NET 功能使用,也不需要任何額外步驟來存取程式碼中的值。然而,如果想要檢視解密的設定,則可以遵循下列步驟。
若要檢視解密的組態值
開啟文字編輯器,然後將下列 ASP.NET 程式碼複製到新檔案中。
<%@ Page Language="VB" %> <%@ Import Namespace="System.Configuration" %> <%@ Import Namespace="System.Web.Configuration" %> <script > Public Sub Page_Load() ConnectionStringsGrid.DataSource = ConfigurationManager.ConnectionStrings ConnectionStringsGrid.DataBind() Dim config As System.Configuration.Configuration = _ WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath) Dim key As MachineKeySection = _ CType(config.GetSection("system.web/machineKey"), MachineKeySection) DecryptionKey.Text = key.DecryptionKey ValidationKey.Text = key.ValidationKey End Sub </script> <html> <body> <form > <asp:GridView CellPadding="4" id="ConnectionStringsGrid" /> <P> MachineKey.DecryptionKey = <asp:Label runat="Server" id="DecryptionKey" /><BR> MachineKey.ValidationKey = <asp:Label runat="Server" id="ValidationKey" /> </form> </body> </html>
<%@ Page Language="C#" %> <%@ Import Namespace="System.Configuration" %> <%@ Import Namespace="System.Web.Configuration" %> <script > public void Page_Load() { ConnectionStringsGrid.DataSource = ConfigurationManager.ConnectionStrings; ConnectionStringsGrid.DataBind(); Configuration config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath); MachineKeySection key = (MachineKeySection)config.GetSection("system.web/machineKey"); DecryptionKey.Text = key.DecryptionKey; ValidationKey.Text = key.ValidationKey; } </script> <html> <body> <form > <asp:GridView CellPadding="4" id="ConnectionStringsGrid" /> <P> MachineKey.DecryptionKey = <asp:Label runat="Server" id="DecryptionKey" /><BR> MachineKey.ValidationKey = <asp:Label runat="Server" id="ValidationKey" /> </form> </body> </html>
將檔案另存為 walkthrough.aspx,然後在瀏覽器中檢視該檔案。
您將會看到已加密之 Web.config 檔的解密值。
若要將網站的敏感性資訊保留為私用資訊,請在完成這個逐步解說時刪除 walkthrough.aspx 檔。
後續步驟
如果將 aspnet_regiis.exe 與 -pd 選項搭配執行,則請在需要時解密已加密的 Web.config 檔內容。除了未指定受保護的組態提供者外,語法與使用 -pe 選項加密 Web.config 檔內容相同。使用 protected 區段的 configProtectionProvider 項目會識別適當提供者。例如,下列命令會解密 ASP.NET 應用程式 (名為 MyApplication) 之 Web.config 檔中的 <connectionStrings> 項目,以及 <system.web> 項目的 <machineKey> 子項目。
aspnet_regiis -pd "connectionStrings" -app "/MyApplication"
aspnet_regiis -pd "system.web/machineKey" -app "/MyApplication"