逐步解說:建立和匯出 RSA 金鑰容器

更新:2007 年 11 月

提供建立、匯出和匯入加密金鑰的逐步範例,以解密來自多個伺服器之單一加密檔案的加密 Web.config 區段。

「受保護的組態」透過讓您加密儲存在組態檔中的敏感性資訊,協助改善應用程式的安全性。.NET Framework 會在處理組態檔時自動解密組態檔,而且解密不需要任何額外程式碼。可以使用 aspnet_regiis.exe 加密組態檔的區段,以及管理加密金鑰。如需「受保護的組態」的詳細資訊,請參閱使用受保護的組態加密組態資訊

「受保護的組態」可讓您建立、刪除、匯出和匯入自訂的加密金鑰,以與 RsaProtectedConfigurationProvider 提供者搭配使用。這可讓您建立加密金鑰的備份複本,或將加密金鑰複製到多個 Web 伺服器 (如 Web 伺服陣列),以便將具有加密 Web.config 檔的應用程式複製到多個位置。

在瀏覽這份逐步解說期間,您將了解如何執行下列作業:

  • 建立自訂 RSA 金鑰容器。

  • 指定「受保護的組態」提供者,這個提供者使用自訂的 RSA 金鑰容器。

  • 使用自訂的 RSA 金鑰容器加密 Web.config 檔的區段。

  • 匯出自訂 RSA 金鑰容器至 XML 檔案。

  • 從 XML 檔案匯入自訂 RSA 金鑰容器。

必要條件

若要完成這個逐步解說,您必須進行下列步驟:

建立自訂 RSA 金鑰容器

在這部分的逐步解說中,會搭配使用 aspnet_regiis.exe 與 -pc 選項,來建立 RSA 金鑰容器。這會將 RSA 金鑰容器識別為使用者層級的金鑰容器。RSA 金鑰容器必須使用 -pku 選項識別為使用者層級,或省略 -pku 選項識別為電腦層級。如需電腦層級和使用者層級 RSA 金鑰容器的詳細資訊,請參閱了解電腦層級和使用者層級的 RSA 金鑰容器

若要建立電腦層級 RSA 金鑰容器

  1. 開啟命令提示字元。

    • 若要這麼做,請在 Microsoft Windows 中按一下 [開始],再按一下 [執行],並在 [開啟] 方塊中輸入 cmd,然後按一下 [確定]。
  2. 在命令提示字元中,輸入下列命令,以便將目錄變更為 .NET Framework 2.0 版目錄:

    cd \WINDOWS\Microsoft.Net\Framework\v2.0.*

  3. 使用下列選項執行 aspnet_regiis.exe,建立新的電腦層級 RSA 金鑰容器:

    • -pc 選項,後接有 RSA 金鑰容器名稱,用以建立 RSA 金鑰組。

    • -exp 選項,用以確定金鑰是可匯出的。

    下列命令會建立 "MyKeys" 金鑰容器。

    aspnet_regiis -pc "MyKeys" -exp

    請勿關閉 [命令提示字元] 視窗。

授與 RSA 加密金鑰讀取權限

在 ASP.NET 可以解密 Web.config 檔中的加密資訊之前,ASP.NET 應用程式的識別 (Identity) 必須具有用來加密和解密加密之區段的加密金鑰讀取權限。

若要授與 ASP.NET 識別 RSA 金鑰容器的存取權

  1. 開啟文字編輯器,然後將下列程式碼複製到新檔案中。

    <%@ Page Language="VB" %>
    <%
    Response.Write(System.Security.Principal.WindowsIdentity.GetCurrent().Name)
    %>
    
    <%@ Page Language="C#" %>
    <%
    Response.Write(System.Security.Principal.WindowsIdentity.GetCurrent().Name);
    %>
    
  2. 將檔案以下列名稱儲存在應用程式目錄中:identity.aspx。

  3. 若要判斷 ASP.NET 應用程式的識別,請用瀏覽器開啟 identity.aspx。

    ASP.NET 應用程式的模擬識別會出現在瀏覽器中。

    注意事項:

    針對這個逐步解說,請不要將模擬驗證 (Authentication) 用於網站。也就是說,只使用匿名驗證做為 ASP.NET 應用程式的識別。針對這個逐步解說,如果應用程式的識別是應用程式之 Web.config 檔中目前登入的使用者 ID (例如 DOMAIN\userid),請停用模擬。若要停用模擬,請編輯 Web.config 檔並移除 <identity> 項目。進行這項變更之後,請在瀏覽器中更新 identity.aspx,以顯示應用程式的已修改識別。

  4. 在命令提示字元中,執行 aspnet_regiis.exe,並搭配使用下列選項,將識別存取權授與 RSA 金鑰容器:

    • -pa 選項,後接有 RSA 金鑰容器名稱 "MyKeys"

    • ASP.NET 應用程式的識別,如之前的步驟中所判斷。

    例如,下列命令會將 NETWORK SERVICE 帳戶存取權授與電腦層級 RSA 金鑰容器 "MyKeys"

    注意事項:

    在執行 Windows Server 2003 且已於 Web.config 檔案中停用 ASP.NET 應用程式模擬的電腦上,應用程式的識別便是 NETWORK SERVICE 帳戶 (在舊版 Windows 上,這是指本機 ASPNET 帳戶)。

    aspnet_regiis -pa "MyKeys" "NT AUTHORITY\NETWORK SERVICE"

指定受保護的組態提供者

在這部分的逐步解說中,會在 ASP.NET 應用程式的 Web.config 檔中指定「受保護的組態」提供者的執行個體。使用電腦層級 RSA 金鑰容器 (名為 "MyKeys") 之「受保護的組態」提供者的執行個體,就是在上一個程序中所建立的執行個體。

若要指定受保護的組態提供者的執行個體

  1. 開啟文字編輯器,然後開啟 ASP.NET 應用程式的 Web.config 檔。

    • 如果沒有 ASP.NET 應用程式的 Web.config 檔,請開啟文字編輯器,然後將範例組態複製到新檔案中。請將檔案以下列名稱儲存在 ASP.NET 應用程式目錄中:web.config。
  2. 確認組態包含 <connectionStrings> 項目 (如下列範例所示)。

    <configuration>
       <connectionStrings>
          <add name="SqlServices" connectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;" />
       </connectionStrings>
    </configuration>
    
  3. 加入 <configProtectedData> 區段,這個區段包含名為 "MyProvider" 之 RsaProtectedConfigurationProvider 類別的執行個體,而這個執行個體使用名為 "MyKeys", 的電腦層級 RSA 金鑰容器 (如下列範例所示)。

    <configuration>
       <configProtectedData>
          <providers>
             <add name="MyProvider"
                  type="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0. 0.0,
                        Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a,
                        processorArchitecture=MSIL"
                  keyContainerName="MyKeys" 
                  useMachineContainer="true" />
          </providers>
       </configProtectedData>
    
       <connectionStrings>
          <add name="SqlServices" connectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;" />
       </connectionStrings>
    </configuration>
    
  4. 儲存並關閉 Web.config 檔。

加密 Web.config 檔案的區段

請注意,如果已指定 RsaProtectedConfigurationProvider 類別的執行個體 (其使用 "MyKeys" RSA 金鑰容器),且 ASP.NET 應用程式的識別具有 "MyKeys" 的讀取權限,則使用 "MyKeys" 可加密 ASP.NET 應用程式之 Web.config 檔的加密區段,然後 ASP.NET 會在處理 Web.config 檔時解密這些區段。

若要加密 Web.config 檔的 <connectionStrings> 區段

  1. 在命令提示字元中,使用下列選項執行 aspnet_regiis.exe:

    • -pe 選項,其後接著 "connectionStrings",用以加密應用程式之 Web.config 檔的 <connectionStrings> 項目。

    • -app 選項,以識別您的應用程式名稱。

    • -prov 選項,其後接著 "MyProvider",用以識別在上一節之 Web.config 檔中指定的 RsaProtectedConfigurationProvider 提供者。

    例如,下列命令會加密名為 MyApplication 之應用程式 Web.config 檔的 <connectionStrings> 區段。

    aspnet_regiis -pe "connectionStrings" -app "/MyApplication" -prov "MyProvider"

  2. 開啟 Web.config 檔,然後檢視加密的內容。

    內容與下列 Web.config 檔範例類似。

    <configuration>
       <configProtectedData>
          <providers>
             <add name="MyProvider"
                  type="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0. 0.0,
                        Culture=neutral, PublicKeyToken= b03f5f7f11d50a3a,
                        processorArchitecture=MSIL"
                  keyContainerName="MyKeys" 
                  useMachineContainer="true" />
          </providers>
       </configProtectedData>
    
       <connectionStrings configProtectionProvider="MyProvider">
          <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>
    </configuration>
    
  3. 關閉 Web.config 檔。

存取解密的組態設定

ASP.NET 在處理 Web.config 檔時,會自動解密該檔案的內容。因此,不需要任何步驟來解密已加密的組態設定,以供其他 ASP.NET 功能使用,也不需要任何步驟來存取程式碼中的值。然而,如果想要檢視解密的設定,則可以遵循下列步驟。

若要檢視解密的組態值

  1. 開啟文字編輯器,然後將下列 ASP.NET 程式碼複製到新檔案中。

    <%@ Page Language="VB" %>
    <%@ Import Namespace="System.Configuration" %>
    <script >
    
    Public Sub Page_Load()
    
      ConnectionStringsGrid.DataSource = ConfigurationManager.ConnectionStrings
      ConnectionStringsGrid.DataBind()
    End Sub
    
    </script>
    <html>
    
    <body>
    
    <form >
      <asp:GridView  CellPadding="4" id="ConnectionStringsGrid" />
    </form>
    
    </body>
    </html>
    
    <%@ Page Language="C#" %>
    <%@ Import Namespace="System.Configuration" %>
    <script >
    
    public void Page_Load()
    {
      ConnectionStringsGrid.DataSource = ConfigurationManager.ConnectionStrings;
      ConnectionStringsGrid.DataBind();
    }
    
    </script>
    <html>
    
    <body>
    
    <form >
      <asp:GridView  CellPadding="4" id="ConnectionStringsGrid" />
    </form>
    
    </body>
    </html>
    
  2. 將檔案另存為 walkthrough.aspx,然後在瀏覽器中檢視該檔案。

    您將會看到已加密之 Web.config 檔的解密值。

匯出及匯入 RSA 金鑰容器

您可以將 RSA 金鑰容器匯出至 XML 檔案,做為金鑰值的備份複本,或將金鑰容器複製到其他 Web 伺服器,這個伺服器會裝載內含加密之 Web.config 檔的應用程式複本。如果沒有用於加密 Web.config 檔的特定 RSA 金鑰容器,則 ASP.NET 無法解密已加密的組態值。

若要檢視解密的組態值

  1. 在命令提示字元中,使用下列選項執行 aspnet_regiis.exe:

    • -px 選項,其後接著 "MyKeys",是 RSA 金鑰容器名稱,該容器為您在這個逐步解說前面之「建立自訂 RSA 金鑰容器」中所建立的。

    • 要將金鑰容器匯出至的 .xml 檔案路徑。

    • -pri 選項,用以確定匯出私密金鑰資訊。否則,匯出的金鑰資訊將只能加密資訊,但無法解密資訊。

    例如,下列命令會將名為 "MyKeys" 的電腦層級 RSA 金鑰容器匯出至 C 磁碟根目錄中名為 keys.xml 的 .xml 檔案中。

    aspnet_regiis -px "MyKeys" "c:\keys.xml" -pri

    注意事項:

    若要確定沒有人可解密 RSA 金鑰容器所加密的 Web.config 檔,則將 RSA 金鑰容器匯出至 .xml 檔案後,請將 .xml 檔案複製到 Web 伺服器外部的位置中,然後從 Web 伺服器中刪除該檔案。

    您現在已擁有所有必要資訊,可使用加密的 Web.config 檔將應用程式複製到不同的 Web 伺服器。

  2. 如果想要使用加密的 Web.config 檔將應用程式複製到不同的 Web 伺服器,請跳到步驟 4。

  3. 如果沒有第二部要複製應用程式的目標 Web 伺服器,但想要繼續這個逐步解說,請完成下列步驟,從 Web 伺服器中刪除 RSA 金鑰容器。然後,將 Web 伺服器視為第二部 Web 伺服器。

    1. 若要刪除 RSA 金鑰容器,請在命令提示字元中,搭配執行 aspnet_regiis.exe 與 -pz 參數,其後接著 "MyKeys"

      例如,下列命令會刪除 "MyKeys"

      aspnet_regiis -pz "MyKeys"

    2. 移至步驟 5。

  4. 複製 Web 應用程式 (包括加密的 Web.config 檔) 至第二部 Web 伺服器。

    • 如果不確定如何將 Web 應用程式複製到第二部伺服器,請將整個資料夾和內容從現有應用程式複製到第二部 Web 伺服器,然後遵循 HOW TO:在 IIS 5.0 和 6.0 中建立和設定虛擬目錄 中的步驟進行,將應用程式識別為 Web 應用程式。
  5. 在第二部伺服器上,開啟 [命令提示字元] 視窗,然後輸入下列命令,將目錄變更為 .NET Framework 2.0 版目錄:

    cd \WINDOWS\Microsoft.Net\Framework\v2.0.*

  6. 將包含匯出之 RSA 金鑰容器的 .xml 檔案複製到第二部 Web 伺服器的 .NET Framework 2.0 版目錄中。

    在這個逐步解說中,會將 keys.xml 檔複製到 C 磁碟的根目錄中。

  7. 在第二部 Web 伺服器上,請在命令提示字元中將 aspnet_regiis.exe 與下列選項搭配執行:

    • -pi 選項其後接著匯出的金鑰容器名稱 "MyKeys",用以匯入 RSA 金鑰容器。

    • .xml 檔案的路徑,該檔案包含匯出的金鑰容器。

    例如,下列命令會匯入名為 "MyKeys" 的 RSA 金鑰容器。

    aspnet_regiis -pi "MyKeys" "c:\keys.xml"

  8. 在第二部 Web 伺服器上,刪除 .xml 檔案的複本,這個檔案包含匯出的 RSA 金鑰容器。

  9. 在第二部 Web 伺服器上,使用先前在這個逐步解說之「授與 RSA 加密金鑰讀取權限」中所述的步驟,判斷 ASP.NET 應用程式的識別,然後將匯入之 RSA 金鑰容器的存取權授與該識別。

  10. 在第二部 Web 伺服器上,使用上一節中的步驟,來檢視加密之 Web.config 檔的已解密組態設定。

請參閱

工作

逐步解說:使用受保護的組態加密組態資訊

其他資源

使用受保護的組態加密組態資訊