앱 간에 인증서 공유Share certificates between apps

사용자 Id 및 암호 조합 이외의 보안 인증을 필요로 하는 UWP (유니버설 Windows 플랫폼) 앱은 인증을 위해 인증서를 사용할 수 있습니다.Universal Windows Platform (UWP) apps that require secure authentication beyond a user Id and password combination can use certificates for authentication. 인증서 인증은 사용자를 인증할 때 높은 수준의 신뢰를 제공합니다.Certificate authentication provides a high level of trust when authenticating a user. 서비스 그룹에서 여러 개의 앱에 대해 사용자를 인증하려는 경우도 있습니다.In some cases, a group of services will want to authenticate a user for multiple apps. 이 문서에서는 동일한 인증서를 사용하여 여러 개의 앱을 인증하는 방법 및 보안 웹 서비스 액세스를 위해 제공된 인증서를 사용자가 가져오는 데 편리한 코드를 제공하는 방법을 보여 줍니다.This article shows how you can authenticate multiple apps using the same certificate, and how you can provide convenient code for a user to import a certificate that was provided to access secured web services.

앱은 인증서를 사용 하 여 웹 서비스에 인증할 수 있으며, 여러 앱은 인증서 저장소에서 단일 인증서를 사용 하 여 동일한 사용자를 인증할 수 있습니다.Apps can authenticate to a web service using a certificate, and multiple apps can use a single certificate from the certificate store to authenticate the same user. 인증서가 저장소에 없는 경우 응용 프로그램에 코드를 추가 하 여 PFX 파일에서 인증서를 가져올 수 있습니다.If a certificate does not exist in the store, you can add code to your app to import a certificate from a PFX file.

Microsoft 인터넷 정보 서비스 (IIS) 및 클라이언트 인증서 매핑 사용Enable Microsoft Internet Information Services (IIS) and client certificate mapping

이 문서에서는 예를 들어 Microsoft 인터넷 정보 서비스 (IIS)를 사용 합니다.This article uses Microsoft Internet Information Services (IIS) for example purposes. IIS는 기본적으로 사용 되지 않습니다.IIS is not enabled by default. 제어판을 사용 하 여 IIS를 사용 하도록 설정할 수 있습니다.You can enable IIS by using the Control Panel.

  1. 제어판을 열고 프로그램을 선택 합니다.Open the Control Panel and select Programs.
  2. Windows 기능 사용/사용 안 함을선택 합니다.Select Turn Windows features on or off.
  3. 인터넷 정보 서비스 확장 한 다음 World Wide Web Services를 확장 합니다.Expand Internet Information Services and then expand World Wide Web Services. 응용 프로그램 개발 기능 을 확장 하 고 ASP.NET 3.5ASP.NET 4.5를 선택 합니다.Expand Application Development Features and select ASP.NET 3.5 and ASP.NET 4.5. 이러한 항목을 선택 하면 인터넷 정보 서비스자동으로 사용 하도록 설정 됩니다.Making these selections will automatically enable Internet Information Services.
  4. 확인을 클릭하여 변경 내용을 적용합니다.Click OK to apply the changes.

보안 웹 서비스 만들기 및 게시Create and publish a secured web service

  1. 관리자 권한으로 Microsoft Visual Studio를 실행 하 고 시작 페이지에서 새 프로젝트 를 선택 합니다.Run Microsoft Visual Studio as administrator and select New Project from the start page. IIS 서버에 웹 서비스를 게시 하려면 관리자 권한이 필요 합니다.Administrator access is required to publish a web service to an IIS server. 새 프로젝트 대화 상자에서 프레임 워크를 .NET Framework 3.5로 변경 합니다.In the New Project dialog, change the framework to .NET Framework 3.5. Visual c # - > - > visual Studio - > ASP.NET 웹 서비스 응용 프로그램을 선택 합니다.Select Visual C# -> Web -> Visual Studio -> ASP.NET Web Service Application. 응용 프로그램 이름을 "FirstContosoBank"로 합니다.Name the application "FirstContosoBank". 확인을 클릭하여 프로젝트를 만듭니다.Click OK to create the project.

  2. Service1.asmx.cs 파일에서 기본 HelloWorld 웹 메서드를 다음 "Login" 메서드로 바꿉니다.In the Service1.asmx.cs file, replace the default HelloWorld web method with the following "Login" method.

            [WebMethod]
            public string Login()
            {
                // Verify certificate with CA
                var cert = new System.Security.Cryptography.X509Certificates.X509Certificate2(
                    this.Context.Request.ClientCertificate.Certificate);
                bool test = cert.Verify();
                return test.ToString();
            }
    
  3. Service1.asmx.cs 파일을 저장 합니다.Save the Service1.asmx.cs file.

  4. 솔루션 탐색기에서 "FirstContosoBank" 앱을 마우스 오른쪽 단추로 클릭 하 고 게시를 선택 합니다.In the Solution Explorer, right-click the "FirstContosoBank" app and select Publish.

  5. 웹 게시 대화 상자에서 새 프로필을 만들고 이름을 "ContosoProfile"로 합니다.In the Publish Web dialog, create a new profile and name it "ContosoProfile". 다음을 클릭합니다.Click Next.

  6. 다음 페이지에서 IIS 서버에 대 한 서버 이름을 입력 하 고 "Default Web Site/FirstContosoBank"의 사이트 이름을 지정 합니다.On the next page, enter the server name for your IIS server, and specify a site name of "Default Web Site/FirstContosoBank". 게시 를 클릭 하 여 웹 서비스를 게시 합니다.Click Publish to publish your web service.

클라이언트 인증서 인증을 사용 하도록 웹 서비스 구성Configure your web service to use client certificate authentication

  1. 인터넷 정보 서비스 (IIS) 관리자를 실행 합니다.Run the Internet Information Services (IIS) Manager.
  2. IIS 서버에 대 한 사이트를 확장 합니다.Expand the sites for your IIS server. 기본 웹 사이트에서 새 "FirstContosoBank" 웹 서비스를 선택 합니다.Under the Default Web Site, select the new "FirstContosoBank" web service. 작업 섹션에서 고급 설정...을 선택 합니다.In the Actions section, select Advanced Settings....
  3. 응용 프로그램 풀.net v 2.0 으로 설정 하 고 확인을 클릭 합니다.Set the Application Pool to .NET v2.0 and click OK.
  4. 인터넷 정보 서비스 (iis) 관리자에서 iis 서버를 선택 하 고 서버 인증서를 두 번 클릭 합니다.In the Internet Information Services (IIS) Manager, select your IIS server and then double-click Server Certificates. 작업 섹션에서 자체 서명 된 인증서 만들기...를 선택 합니다. 인증서의 이름으로 "ContosoBank"를 입력 하 고 확인을 클릭 합니다.In the Actions section, select Create Self-Signed Certificate.... Enter "ContosoBank" as the friendly name for the certificate and click OK. 이렇게 하면 IIS 서버에서 "서버 이름" 형식으로 사용할 새 인증서를 만듭니다 < > . < 도메인 이름 > ".This will create a new certificate for use by the IIS server in the form of "<server-name>.<domain-name>".
  5. 인터넷 정보 서비스 (IIS) 관리자에서 기본 웹 사이트를 선택 합니다.In the Internet Information Services (IIS) Manager, select the default web site. 작업 섹션에서 바인딩 을 선택 하 고 추가...를 클릭 합니다. 유형으로 "https"를 선택 하 고, 포트를 "443"로 설정 하 고, IIS 서버의 전체 호스트 이름 ("서버 이름")을 입력 합니다 < > . < 도메인 이름 > ").In the Actions section, select Binding and then click Add.... Select "https" as the type, set the port to "443", and enter the full host name for your IIS server ("<server-name>.<domain-name>"). SSL 인증서를 "ContosoBank"로 설정 합니다.Set the SSL certificate to "ContosoBank". 확인을 클릭합니다.Click OK. 사이트 바인딩 창에서 닫기 를 클릭 합니다.Click Close in the Site Bindings window.
  6. 인터넷 정보 서비스 (IIS) 관리자에서 "FirstContosoBank" 웹 서비스를 선택 합니다.In the Internet Information Services (IIS) Manager, select the "FirstContosoBank" web service. SSL 설정을 두 번 클릭 합니다.Double-click SSL Settings. SSL 필요를 선택 합니다.Check Require SSL. 클라이언트 인증서아래에서 요구를 선택 합니다.Under Client certificates, select Require. 작업 섹션에서 적용을 클릭 합니다.In the Actions section, click Apply.
  7. 웹 브라우저를 열고 다음 웹 주소를 입력 하 여 웹 서비스가 올바르게 구성 되어 있는지 확인할 수 있습니다. "https:// < > . < 도메인 이름 > /FirstContosoBank/Service1.asmx ".You can verify that the web service is configured correctly by opening your web browser and entering the following web address: "https://<server-name>.<domain-name>/FirstContosoBank/Service1.asmx". 예: "https://myserver.example.com/FirstContosoBank/Service1.asmx".For example, "https://myserver.example.com/FirstContosoBank/Service1.asmx". 웹 서비스가 올바르게 구성 된 경우 웹 서비스에 액세스 하기 위해 클라이언트 인증서를 선택 하 라는 메시지가 표시 됩니다.If your web service is configured correctly, you will be prompted to select a client certificate in order to access the web service.

이전 단계를 반복 하 여 동일한 클라이언트 인증서를 사용 하 여 액세스할 수 있는 웹 서비스를 여러 개 만들 수 있습니다.You can repeat the previous steps to create multiple web services that can be accessed using the same client certificate.

인증서 인증을 사용 하는 UWP 앱 만들기Create a UWP app that uses certificate authentication

이제 하나 이상의 보안 웹 서비스가 있으므로 앱에서 인증서를 사용 하 여 해당 웹 서비스에 인증할 수 있습니다.Now that you have one or more secured web services, your apps can use certificates to authenticate to those web services. Httpclient 개체를 사용 하 여 인증 된 웹 서비스에 요청을 수행 하면 초기 요청에 클라이언트 인증서가 포함 되지 않습니다.When you make a request to an authenticated web service using the HttpClient object, the initial request will not contain a client certificate. 인증 된 웹 서비스는 클라이언트 인증 요청을 사용 하 여 응답 합니다.The authenticated web service will respond with a request for client authentication. 이 경우 Windows 클라이언트는 인증서 저장소에서 사용 가능한 클라이언트 인증서를 자동으로 쿼리 합니다.When this occurs, the Windows client will automatically query the certificate store for available client certificates. 사용자는 이러한 인증서를 선택 하 여 웹 서비스에 인증할 수 있습니다.Your user can select from these certificates to authenticate to the web service. 일부 인증서는 암호로 보호 되므로 사용자에 게 인증서 암호를 입력 하는 방법을 제공 해야 합니다.Some certificates are password protected, so you will need to provide the user with a way to input the password for a certificate.

사용할 수 있는 클라이언트 인증서가 없는 경우 인증서 저장소에 인증서를 추가 해야 합니다.If there are no client certificates available, then the user will need to add a certificate to the certificate store. 사용자가 클라이언트 인증서가 포함 된 PFX 파일을 선택 하 고 해당 인증서를 클라이언트 인증서 저장소로 가져올 수 있도록 하는 코드를 앱에 포함할 수 있습니다.You can include code in your app that enables a user to select a PFX file that contains a client certificate and then import that certificate into the client certificate store.

   makecert.exe를 사용 하 여이 빠른 시작에 사용할 PFX 파일을 만들 수 있습니다.Tip  You can use makecert.exe to create a PFX file to use with this quickstart. makecert.exe 사용에 대 한 자세한 내용은 makecert.exe 를 참조 하세요.For information on using makecert.exe, see MakeCert.

 

  1. Visual Studio를 열고 시작 페이지에서 새 프로젝트를 만듭니다.Open Visual Studio and create a new project from the start page. 새 프로젝트의 이름을 "FirstContosoBankApp"로 합니다.Name the new project "FirstContosoBankApp". 확인을 클릭하여 새 프로젝트를 만듭니다.Click OK to create the new project.

  2. MainPage .xaml 파일에서 다음 XAML을 기본 Grid 요소에 추가 합니다.In the MainPage.xaml file, add the following XAML to the default Grid element. 이 XAML에는 가져올 PFX 파일을 검색 하는 단추, 암호로 보호 된 PFX 파일에 대 한 암호를 입력 하는 입력란, 선택한 PFX 파일을 가져오는 단추, 보안 웹 서비스에 로그인 하는 데 사용할 수 있는 단추 및 현재 동작의 상태를 표시 하는 텍스트 블록이 포함 되어 있습니다.This XAML includes a button to browse for a PFX file to import, a text box to enter a password for a password-protected PFX file, a button to import a selected PFX file, a button to log in to the secured web service, and a text block to display the status of the current action.

    <Button x:Name="Import" Content="Import Certificate (PFX file)" HorizontalAlignment="Left" Margin="352,305,0,0" VerticalAlignment="Top" Height="77" Width="260" Click="Import_Click" FontSize="16"/>
    <Button x:Name="Login" Content="Login" HorizontalAlignment="Left" Margin="611,305,0,0" VerticalAlignment="Top" Height="75" Width="240" Click="Login_Click" FontSize="16"/>
    <TextBlock x:Name="Result" HorizontalAlignment="Left" Margin="355,398,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Height="153" Width="560"/>
    <PasswordBox x:Name="PfxPassword" HorizontalAlignment="Left" Margin="483,271,0,0" VerticalAlignment="Top" Width="229"/>
    <TextBlock HorizontalAlignment="Left" Margin="355,271,0,0" TextWrapping="Wrap" Text="PFX password" VerticalAlignment="Top" FontSize="18" Height="32" Width="123"/>
    <Button x:Name="Browse" Content="Browse for PFX file" HorizontalAlignment="Left" Margin="352,189,0,0" VerticalAlignment="Top" Click="Browse_Click" Width="499" Height="68" FontSize="16"/>
    <TextBlock HorizontalAlignment="Left" Margin="717,271,0,0" TextWrapping="Wrap" Text="(Optional)" VerticalAlignment="Top" Height="32" Width="83" FontSize="16"/>
    
  3. MainPage .xaml 파일을 저장 합니다.Save the MainPage.xaml file.

  4. MainPage.xaml.cs 파일에서 다음 using 문을 추가 합니다.In the MainPage.xaml.cs file, add the following using statements.

    using Windows.Web.Http;
    using System.Text;
    using Windows.Security.Cryptography.Certificates;
    using Windows.Storage.Pickers;
    using Windows.Storage;
    using Windows.Storage.Streams;
    
  5. MainPage.xaml.cs 파일에서 다음 변수를 Mainpage 클래스에 추가 합니다.In the MainPage.xaml.cs file, add the following variables to the MainPage class. "FirstContosoBank" 웹 서비스에 대 한 보안 "로그인" 방법의 주소와 인증서 저장소로 가져올 PFX 인증서를 포함 하는 전역 변수를 지정 합니다.They specify the address for the secured "Login" method of your "FirstContosoBank" web service, and a global variable that holds a PFX certificate to import into the certificate store. <서버 이름을 > Microsoft Iis (인터넷 정보 서버) 서버의 정규화 된 서버 이름으로 업데이트 합니다.Update the <server-name> to the fully-qualified server name for your Microsoft Internet Information Server (IIS) server.

    private Uri requestUri = new Uri("https://<server-name>/FirstContosoBank/Service1.asmx?op=Login");
    private string pfxCert = null;
    
  6. MainPage.xaml.cs 파일에서 로그인 단추 및 메서드에 대해 다음 클릭 처리기를 추가 하 여 보안 웹 서비스에 액세스 합니다.In the MainPage.xaml.cs file, add the following click handler for the login button and method to access the secured web service.

    private void Login_Click(object sender, RoutedEventArgs e)
    {
        MakeHttpsCall();
    }
    
    private async void MakeHttpsCall()
    {
    
        StringBuilder result = new StringBuilder("Login ");
        HttpResponseMessage response;
        try
        {
            Windows.Web.Http.HttpClient httpClient = new Windows.Web.Http.HttpClient();
            response = await httpClient.GetAsync(requestUri);
            if (response.StatusCode == HttpStatusCode.Ok)
            {
                result.Append("successful");
            }
            else
            {
                result = result.Append("failed with ");
                result = result.Append(response.StatusCode);
            }
        }
        catch (Exception ex)
        {
            result = result.Append("failed with ");
            result = result.Append(ex.Message);
        }
    
        Result.Text = result.ToString();
    }
    
  7. MainPage.xaml.cs 파일에서 단추에 대 한 다음 클릭 처리기를 추가 하 여 PFX 파일을 찾고, 단추를 선택 하 여 선택한 PFX 파일을 인증서 저장소로 가져옵니다.In the MainPage.xaml.cs file, add the following click handlers for the button to browse for a PFX file and the button to import a selected PFX file into the certificate store.

    private async void Import_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            Result.Text = "Importing selected certificate into user certificate store....";
            await CertificateEnrollmentManager.UserCertificateEnrollmentManager.ImportPfxDataAsync(
                pfxCert,
                PfxPassword.Password,
                ExportOption.Exportable,
                KeyProtectionLevel.NoConsent,
                InstallOptions.DeleteExpired,
                "Import Pfx");
    
            Result.Text = "Certificate import succeded";
        }
        catch (Exception ex)
        {
            Result.Text = "Certificate import failed with " + ex.Message;
        }
    }
    
    private async void Browse_Click(object sender, RoutedEventArgs e)
    {
    
        StringBuilder result = new StringBuilder("Pfx file selection ");
        FileOpenPicker pfxFilePicker = new FileOpenPicker();
        pfxFilePicker.FileTypeFilter.Add(".pfx");
        pfxFilePicker.CommitButtonText = "Open";
        try
        {
            StorageFile pfxFile = await pfxFilePicker.PickSingleFileAsync();
            if (pfxFile != null)
            {
                IBuffer buffer = await FileIO.ReadBufferAsync(pfxFile);
                using (DataReader dataReader = DataReader.FromBuffer(buffer))
                {
                    byte[] bytes = new byte[buffer.Length];
                    dataReader.ReadBytes(bytes);
                    pfxCert = System.Convert.ToBase64String(bytes);
                    PfxPassword.Password = string.Empty;
                    result.Append("succeeded");
                }
            }
            else
            {
                result.Append("failed");
            }
        }
        catch (Exception ex)
        {
            result.Append("failed with ");
            result.Append(ex.Message); ;
        }
    
        Result.Text = result.ToString();
    }
    
  8. 앱을 실행 하 고 보안 웹 서비스에 로그인 하 고 PFX 파일을 로컬 인증서 저장소로 가져옵니다.Run your app and log in to your secured web service as well as import a PFX file into the local certificate store.

이러한 단계를 사용 하 여 동일한 사용자 인증서를 사용 하는 여러 앱을 만들어 동일 하거나 다른 보안 웹 서비스에 액세스할 수 있습니다.You can use these steps to create multiple apps that use the same user certificate to access the same or different secured web services.