연습: RSA 키 컨테이너 만들기 및 내보내기

Visual Studio 2010

업데이트: 2007년 11월

여러 서버 상의 암호화된 단일 파일로부터 암호화된 Web.config 파일 섹션을 해독하기 위해 암호화 키를 만들고, 내보내고, 가져오는 단계별 예제를 제공합니다.

보호되는 구성을 사용하면 중요한 정보를 구성 파일에 저장할 수 있도록 허용함으로써 응용 프로그램의 보안을 향상시킬 수 있습니다. .NET Framework에서는 구성 파일이 처리될 때 구성 파일의 암호를 자동으로 해독하기 때문에 암호 해독에 추가 코드가 필요하지 않습니다. aspnet_regiis.exe를 사용하여 구성 파일의 섹션을 암호화하고 암호화 키를 관리할 수 있습니다. 보호되는 구성에 대한 자세한 내용은 보호되는 구성을 사용하여 구성 정보 암호화를 참조하십시오.

보호되는 구성에서는 RSAProtectedConfigurationProvider 공급자에서 사용할 목적으로 사용자 지정 암호화 키를 만들고, 삭제하고, 내보내고, 가져올 수 있습니다. 이렇게 하면 암호화 키의 백업 복사본을 만들거나 웹 팜과 같은 여러 웹 서버로 암호화 키를 복사하여 암호화된 Web.config 파일이 있는 응용 프로그램을 여러 위치로 복사할 수 있습니다.

이 연습을 통해 다음과 같은 작업 방법을 배웁니다.

  • 사용자 지정 RSA 키 컨테이너를 만듭니다.

  • 사용자 지정 RSA 키 컨테이너를 사용하는 보호되는 구성 공급자를 지정합니다.

  • 사용자 지정 RSA 키 컨테이너를 사용하여 Web.config 파일의 섹션을 암호화합니다.

  • 사용자 지정 RSA 키 컨테이너를 XML 파일로 내보냅니다.

  • XML 파일에서 사용자 지정 RSA 키 컨테이너를 가져옵니다.

이 연습을 완료하려면 다음과 같은 요건을 갖추어야 합니다.

  • 사이트를 호스팅하는 컴퓨터에 Microsoft IIS(인터넷 정보 서비스)가 설치 및 구성되어 있어야 합니다.

    IIS를 설치 및 구성하는 방법에 대한 자세한 내용은 IIS 설치에 포함된 온라인 도움말을 참조하거나 Internet Information Services (IIS) 6.0 Technical Resources를 참조하십시오.

  • ASP.NET 웹 사이트.

    웹 사이트가 이미 있으면 해당 사이트를 이 연습에 사용할 수 있습니다. 그렇지 않은 경우 가상 디렉터리나 웹 사이트를 만드는 방법에 대한 자세한 내용은 방법: IIS 5.0 및 6.0에서 가상 디렉터리 만들기 및 구성을 참조하십시오.

이 연습 부분에서는 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

    명령 프롬프트 창을 닫지 마십시오.

ASP.NET에서 Web.config 파일의 암호화된 정보를 해독하려면 ASP.NET 응용 프로그램의 ID에 암호화된 섹션을 암호화 및 해독하는 데 사용되는 암호화 키에 대한 읽기 권한이 있어야 합니다.

RSA 키 컨테이너에 ASP.NET ID 액세스를 부여하려면

  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 응용 프로그램의 ID를 확인하려면 브라우저에서 identity.aspx를 엽니다.

    ASP.NET 응용 프로그램의 가장 ID가 브라우저에 표시됩니다.

    2w117ede.alert_note(ko-kr,VS.100).gif참고:

    이 연습에서는 사이트 인증에 가장을 사용하지 마십시오. 즉, 익명 인증만 ASP.NET 응용 프로그램의 ID로 사용합니다. 이 연습에 있어서 응용 프로그램의 ID가 DOMAIN\userid 같이 현재 로그온한 사용자 ID인 경우에는 응용 프로그램의 Web.config 파일에서 가장을 비활성화하십시오. 가장을 비활성화하려면 Web.config 파일을 편집하여 <identity> 요소를 제거합니다. 이렇게 변경한 다음 브라우저에서 Identity.aspx를 새로 고치면 응용 프로그램의 수정된 ID가 표시됩니다.

  4. 명령 프롬프트에서 aspnet_regiis.exe를 다음 옵션으로 실행하여 RSA 키 컨테이너에 대한 권한을 ID에 부여합니다.

    • -pa 옵션 뒤에 RSA 키 컨테이너의 이름 "MyKeys"를 사용합니다.

    • 이전 단계에서 확인한 ASP.NET 응용 프로그램의 ID를 사용합니다.

    예를 들어 다음 명령은 컴퓨터 수준의 "MyKeys" RSA 키 컨테이너에 NETWORK SERVICE 계정 권한을 부여합니다.

    2w117ede.alert_note(ko-kr,VS.100).gif참고:

    Web.config 파일에서 ASP.NET 응용 프로그램에 대한 가장이 해제된 Microsoft Windows Server 2003을 실행 중인 컴퓨터의 경우 응용 프로그램 ID는 NETWORK SERVICE 계정이며 이전 버전의 Windows 경우에는 로컬 ASPNET 계정입니다.

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

이 연습 부분에서는 ASP.NET 응용 프로그램의 Web.config 파일에 보호되는 구성 공급자 인스턴스를 지정합니다. "MyKeys"라는 컴퓨터 수준 RSA 키 컨테이너를 사용하는 보호되는 구성 공급자 인스턴스는 이전 절차에서 만든 공급자입니다.

보호되는 구성 공급자 인스턴스를 지정하려면

  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. 다음 예제와 같이 "MyKeys",라는 컴퓨터 수준 RSA 키 컨테이너를 사용하는 "MyProvider"라는 RsaProtectedConfigurationProvider 인스턴스가 포함된 <configProtectedData> 섹션을 추가합니다.

    <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 파일을 저장한 다음 닫습니다.

"MyKeys" RSA 키 컨테이너를 사용하는 RsaProtectedConfigurationProvider 클래스 인스턴스가 지정되었고 ASP.NET 응용 프로그램의 ID에 "MyKeys"에 대한 읽기 권한이 있으므로 "MyKeys"를 사용하여 ASP.NET 응용 프로그램에 대한 Web.config 파일의 섹션을 암호화하며 Web.config 파일이 처리될 때 이러한 섹션이 ASP.NET에서 해독됩니다.

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 runat="server">
    
    Public Sub Page_Load()
    
      ConnectionStringsGrid.DataSource = ConfigurationManager.ConnectionStrings
      ConnectionStringsGrid.DataBind()
    End Sub
    
    </script>
    <html>
    
    <body>
    
    <form runat="server">
      <asp:GridView runat="server" CellPadding="4" id="ConnectionStringsGrid" />
    </form>
    
    </body>
    </html>
    

    <%@ Page Language="C#" %>
    <%@ Import Namespace="System.Configuration" %>
    <script runat="server">
    
    public void Page_Load()
    {
      ConnectionStringsGrid.DataSource = ConfigurationManager.ConnectionStrings;
      ConnectionStringsGrid.DataBind();
    }
    
    </script>
    <html>
    
    <body>
    
    <form runat="server">
      <asp:GridView runat="server" CellPadding="4" id="ConnectionStringsGrid" />
    </form>
    
    </body>
    </html>
    
  2. 파일을 walkthrough.aspx로 저장하고 브라우저에서 해당 파일을 봅니다.

    암호화된 Web.config 파일에서 암호가 해독된 값이 표시됩니다.

RSA 키 컨테이너를 키 값에 대한 백업 복사본으로 XML 파일로 내보내거나 암호화된 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

    2w117ede.alert_note(ko-kr,VS.100).gif참고:

    RSA 키 컨테이너로 암호화된 Web.config 파일을 아무도 해독할 수 없도록 하려면 RSA 키 컨테이너를 .xml 파일로 내보낸 후 .xml 파일을 웹 서버 외부의 위치로 복사한 다음 웹 서버에서 파일을 삭제합니다.

    이제 암호화된 Web.config 파일을 사용하여 응용 프로그램을 별개의 웹 서버로 복사하는 데 필요한 모든 정보가 준비되었습니다.

  2. 암호화된 Web.config 파일과 함께 응용 프로그램을 별개의 웹 서버로 복사하려는 경우 4단계로 이동합니다.

  3. 웹 응용 프로그램을 복사할 보조 웹 서버가 없지만 이 연습을 계속 진행하려면 다음 단계를 완료하여 웹 서버에서 RSA 키 컨테이너를 삭제합니다. 그런 다음 웹 서버를 보조 웹 서버로 처리합니다.

    1. RSA 키 컨테이너를 삭제하려면 명령 프롬프트에서 -pz 스위치 뒤에 "MyKeys"를 사용하여 aspnet_regiis.exe를 실행합니다.

      예를 들어 다음 명령은 "MyKeys"를 삭제합니다.

      aspnet_regiis -pz "MyKeys"

    2. 5단계로 이동합니다.

  4. 암호화된 Web.config 파일과 함께 웹 응용 프로그램을 보조 웹 서버로 복사합니다.

    • 웹 응용 프로그램을 보조 서버로 복사하는 방법을 확실히 알지 못하는 경우에는 기존 응용 프로그램에서 전체 폴더와 내용을 보조 웹 서버로 복사한 다음 방법: IIS 5.0 및 6.0에서 가상 디렉터리 만들기 및 구성의 단계에 따라 응용 프로그램을 웹 응용 프로그램으로 식별합니다.

  5. 보조 서버에서 명령 프롬프트 창을 열고 다음 명령을 입력하여 디렉터리를 .NET Framework 버전 2.0 디렉터리로 변경합니다.

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

  6. 내보낸 RSA 키 컨테이너가 포함된 .xml 파일을 보조 웹 서버의 .NET Framework 버전 2.0 디렉터리로 복사합니다.

    이 연습에서는 keys.xml 파일을 C 드라이브의 루트 디렉터리로 복사합니다.

  7. 보조 웹 서버의 명령 프롬프트에서 다음 옵션을 사용하여 aspnet_regiis.exe를 실행합니다.

    • -pi 옵션 뒤에 내보낸 키 컨테이너의 이름인 "MyKeys"를 사용하여 RSA 키 컨테이너를 가져옵니다.

    • 내보낸 키 컨테이너가 포함된 .xml 파일의 경로를 사용합니다.

    예를 들어 다음 명령은 "MyKeys"라는 RSA 키 컨테이너를 가져옵니다.

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

  8. 보조 웹 서버에서 내보낸 RSA 키 컨테이너를 포함하는 .xml 파일의 복사본을 삭제합니다.

  9. 보조 웹 서버에서 ASP.NET 응용 프로그램의 ID를 확인하고, 이 연습의 앞 부분에 있는 "RSA 암호화 키에 읽기 권한 부여" 단계에 따라 가져온 RSA 키 컨테이너에 대한 권한을 해당 ID에 부여합니다.

  10. 보조 웹 서버에서 이전 단원의 단계에 따라 암호화된 Web.config 파일에서 암호 해독된 구성 설정을 봅니다.

표시: