Совместное использование сертификатов приложениями

приложения универсальная платформа Windows (UWP), требующие безопасной проверки подлинности за пределами сочетания идентификаторов пользователя и пароля, могут использовать сертификаты для проверки подлинности. Проверка подлинности сертификата обеспечивает высокий уровень доверия при проверке подлинности пользователя. В некоторых случаях группа служб требует проверки подлинности пользователя для нескольких приложений. В этой статье показано, как выполнить проверку подлинности нескольких приложений с помощью одного сертификата и как можно предоставить удобный код для пользователя для импорта сертификата, предоставленного для доступа к защищенным веб-службам.

Приложения могут проходить проверку подлинности в веб-службе с помощью сертификата, а несколько приложений могут использовать один сертификат из хранилища сертификатов для проверки подлинности одного пользователя. Если сертификат не существует в магазине, вы можете добавить код в приложение для импорта сертификата из PFX-файла.

Включение сопоставления сертификатов Microsoft IIS (IIS) и сертификатов клиента

В этой статье для примера используется Microsoft IIS (IIS). Службы IIS по умолчанию не включены. Службы IIS можно включить с помощью панель управления.

  1. Откройте панель управления и выберите "Программы".
  2. Выберите Включение или отключение компонентов Windows.
  3. Разверните службы IIS, а затем разверните веб-службы World Wide. Разверните функции разработки приложений и выберите ASP.NET 3.5 и ASP.NET 4.5. При выборе этих элементов автоматически будет включена службы IIS.
  4. Нажмите кнопку "ОК" , чтобы применить изменения.

Создание и публикация защищенной веб-службы

  1. Запустите Microsoft Visual Studio от имени администратора и выберите новый проект на начальной странице. Для публикации веб-службы на сервере IIS требуется доступ администратора. В диалоговом окне "Новый проект" измените платформу на платформа .NET Framework 3.5. Выберите Visual C# ->Web ->Visual Studio ->ASP.NET веб-приложение веб-службы. Присвойте приложению имя FirstContosoBank. Нажмите кнопку ОК, чтобы создать проект.

  2. В файле Service1.asmx.cs замените веб-метод HelloWorld по умолчанию следующим методом Login.

            [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 .

  4. В Обозреватель решений щелкните правой кнопкой мыши приложение FirstContosoBank и выберите "Опубликовать".

  5. В диалоговом окне публикации веб-сайта создайте новый профиль и назовите его ContosoProfile. Нажмите кнопку Далее.

  6. На следующей странице введите имя сервера для сервера IIS и укажите имя сайта default Web Site/FirstContosoBank. Нажмите кнопку "Опубликовать", чтобы опубликовать веб-службу.

Настройка веб-службы для использования проверки подлинности сертификата клиента

  1. Запустите диспетчер службы IIS (IIS).
  2. Разверните сайты для сервера IIS. В разделе "Веб-сайт по умолчанию" выберите новую веб-службу FirstContosoBank. В разделе "Действия" выберите "Дополнительные параметры"....
  3. Установите для пула приложений значение .NET версии 2.0 и нажмите кнопку "ОК".
  4. В диспетчере службы IIS (IIS) выберите сервер IIS, а затем дважды щелкните сертификаты сервера. В разделе "Действия" выберите "Создать самозаверяющий сертификат...". Введите "ContosoBank" в качестве понятного имени сертификата и нажмите кнопку "ОК". При этом будет создан новый сертификат для использования сервером IIS в виде имени< сервера>.<доменное имя>".
  5. В диспетчере службы IIS (IIS) выберите веб-сайт по умолчанию. В разделе "Действия" выберите "Привязка" и нажмите кнопку "Добавить...". Выберите "https" в качестве типа, задайте для порта значение "443" и введите полное имя узла для сервера IIS ("<имя> сервера".<доменное имя>"). Задайте для SSL-сертификата значение ContosoBank. Щелкните OK. Нажмите кнопку "Закрыть " в окне "Привязки сайта".
  6. В диспетчере службы IIS (IIS) выберите веб-службу FirstContosoBank. Дважды щелкните параметры SSL. Проверьте , требуется ssl. В разделе "Сертификаты клиента" выберите "Требовать". В разделе "Действия" нажмите кнопку "Применить".
  7. Вы можете убедиться, что веб-служба настроена правильно, открыв веб-браузер и введя следующий веб-адрес: "https://< сервер-имя>.<domain-name>/FirstContosoBank/Service1.asmx". Например, https://myserver.example.com/FirstContosoBank/Service1.asmx". Если веб-служба настроена правильно, вам будет предложено выбрать сертификат клиента для доступа к веб-службе.

Вы можете повторить предыдущие шаги, чтобы создать несколько веб-служб, к которым можно получить доступ с помощью одного сертификата клиента.

Создание приложения UWP, использующего проверку подлинности сертификата

Теперь, когда у вас есть одна или несколько защищенных веб-служб, приложения могут использовать сертификаты для проверки подлинности в этих веб-службах. При выполнении запроса к проверенной веб-службе с помощью объекта HttpClient начальное запрос не будет содержать сертификат клиента. Веб-служба, прошедшие проверку подлинности, будет отвечать на запрос проверки подлинности клиента. При этом клиент Windows автоматически запрашивает хранилище сертификатов для доступных сертификатов. Пользователь может выбрать из этих сертификатов проверку подлинности в веб-службе. Некоторые сертификаты защищены паролем, поэтому пользователю потребуется предоставить пользователю способ ввода пароля для сертификата.

Если нет доступных сертификатов клиента, пользователю потребуется добавить сертификат в хранилище сертификатов. В приложение можно включить код, позволяющий пользователю выбрать PFX-файл, содержащий сертификат клиента, а затем импортировать этот сертификат в хранилище сертификатов клиента.

Совет можно использовать makecert.exe для создания PFX-файла для использования с этим кратким руководством. Сведения об использовании makecert.exe см. в статье MakeCert.

 

  1. Откройте Visual Studio и создайте проект с начальной страницы. Назовите новый проект FirstContosoBankApp. Нажмите кнопку ОК для создания проекта.

  2. В файле MainPage.xaml добавьте следующий код XAML в элемент Grid по умолчанию. Этот КОД XAML содержит кнопку для поиска импорта PFX-файла, текстового поля для ввода пароля защищенного PFX-файла, кнопки для импорта выбранного PFX-файла, кнопки входа в защищенную веб-службу и текстового блока для отображения состояния текущего действия.

    <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.

  4. В файле MainPage.xaml.cs добавьте следующие инструкции using.

    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 . Они указывают адрес защищенного метода Login веб-службы FirstContosoBank и глобальную переменную, содержащую сертификат PFX для импорта в хранилище сертификатов. <Обновите имя сервера до полного имени> сервера для сервера Microsoft Internet Information Server (IIS).

    private Uri requestUri = new Uri("https://<server-name>/FirstContosoBank/Service1.asmx?op=Login");
    private string pfxCert = null;
    
  6. В файле MainPage.xaml.cs добавьте следующий обработчик нажатия кнопки входа и метода для доступа к защищенной веб-службе.

    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-файла в хранилище сертификатов.

    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 succeeded";
        }
        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-файл в локальное хранилище сертификатов.

Эти действия можно использовать для создания нескольких приложений, использующих один и тот же сертификат пользователя для доступа к одинаковым или разным защищенным веб-службам.