Совместное использование сертификатов приложениями
приложения универсальная платформа Windows (UWP), требующие безопасной проверки подлинности за пределами сочетания идентификаторов пользователя и пароля, могут использовать сертификаты для проверки подлинности. Проверка подлинности сертификата обеспечивает высокий уровень доверия при проверке подлинности пользователя. В некоторых случаях группа служб требует проверки подлинности пользователя для нескольких приложений. В этой статье показано, как выполнить проверку подлинности нескольких приложений с помощью одного сертификата и как можно предоставить удобный код для пользователя для импорта сертификата, предоставленного для доступа к защищенным веб-службам.
Приложения могут проходить проверку подлинности в веб-службе с помощью сертификата, а несколько приложений могут использовать один сертификат из хранилища сертификатов для проверки подлинности одного пользователя. Если сертификат не существует в магазине, вы можете добавить код в приложение для импорта сертификата из PFX-файла.
Включение сопоставления сертификатов Microsoft IIS (IIS) и сертификатов клиента
В этой статье для примера используется Microsoft IIS (IIS). Службы IIS по умолчанию не включены. Службы IIS можно включить с помощью панель управления.
- Откройте панель управления и выберите "Программы".
- Выберите Включение или отключение компонентов Windows.
- Разверните службы IIS, а затем разверните веб-службы World Wide. Разверните функции разработки приложений и выберите ASP.NET 3.5 и ASP.NET 4.5. При выборе этих элементов автоматически будет включена службы IIS.
- Нажмите кнопку "ОК" , чтобы применить изменения.
Создание и публикация защищенной веб-службы
Запустите Microsoft Visual Studio от имени администратора и выберите новый проект на начальной странице. Для публикации веб-службы на сервере IIS требуется доступ администратора. В диалоговом окне "Новый проект" измените платформу на платформа .NET Framework 3.5. Выберите Visual C# ->Web ->Visual Studio ->ASP.NET веб-приложение веб-службы. Присвойте приложению имя FirstContosoBank. Нажмите кнопку ОК, чтобы создать проект.
В файле 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(); }
Сохраните файл Service1.asmx.cs .
В Обозреватель решений щелкните правой кнопкой мыши приложение FirstContosoBank и выберите "Опубликовать".
В диалоговом окне публикации веб-сайта создайте новый профиль и назовите его ContosoProfile. Нажмите кнопку Далее.
На следующей странице введите имя сервера для сервера IIS и укажите имя сайта default Web Site/FirstContosoBank. Нажмите кнопку "Опубликовать", чтобы опубликовать веб-службу.
Настройка веб-службы для использования проверки подлинности сертификата клиента
- Запустите диспетчер службы IIS (IIS).
- Разверните сайты для сервера IIS. В разделе "Веб-сайт по умолчанию" выберите новую веб-службу FirstContosoBank. В разделе "Действия" выберите "Дополнительные параметры"....
- Установите для пула приложений значение .NET версии 2.0 и нажмите кнопку "ОК".
- В диспетчере службы IIS (IIS) выберите сервер IIS, а затем дважды щелкните сертификаты сервера. В разделе "Действия" выберите "Создать самозаверяющий сертификат...". Введите "ContosoBank" в качестве понятного имени сертификата и нажмите кнопку "ОК". При этом будет создан новый сертификат для использования сервером IIS в виде имени< сервера>.<доменное имя>".
- В диспетчере службы IIS (IIS) выберите веб-сайт по умолчанию. В разделе "Действия" выберите "Привязка" и нажмите кнопку "Добавить...". Выберите "https" в качестве типа, задайте для порта значение "443" и введите полное имя узла для сервера IIS ("<имя> сервера".<доменное имя>"). Задайте для SSL-сертификата значение ContosoBank. Щелкните OK. Нажмите кнопку "Закрыть " в окне "Привязки сайта".
- В диспетчере службы IIS (IIS) выберите веб-службу FirstContosoBank. Дважды щелкните параметры SSL. Проверьте , требуется ssl. В разделе "Сертификаты клиента" выберите "Требовать". В разделе "Действия" нажмите кнопку "Применить".
- Вы можете убедиться, что веб-служба настроена правильно, открыв веб-браузер и введя следующий веб-адрес: "https://< сервер-имя>.<domain-name>/FirstContosoBank/Service1.asmx". Например, https://myserver.example.com/FirstContosoBank/Service1.asmx". Если веб-служба настроена правильно, вам будет предложено выбрать сертификат клиента для доступа к веб-службе.
Вы можете повторить предыдущие шаги, чтобы создать несколько веб-служб, к которым можно получить доступ с помощью одного сертификата клиента.
Создание приложения UWP, использующего проверку подлинности сертификата
Теперь, когда у вас есть одна или несколько защищенных веб-служб, приложения могут использовать сертификаты для проверки подлинности в этих веб-службах. При выполнении запроса к проверенной веб-службе с помощью объекта HttpClient начальное запрос не будет содержать сертификат клиента. Веб-служба, прошедшие проверку подлинности, будет отвечать на запрос проверки подлинности клиента. При этом клиент Windows автоматически запрашивает хранилище сертификатов для доступных сертификатов. Пользователь может выбрать из этих сертификатов проверку подлинности в веб-службе. Некоторые сертификаты защищены паролем, поэтому пользователю потребуется предоставить пользователю способ ввода пароля для сертификата.
Если нет доступных сертификатов клиента, пользователю потребуется добавить сертификат в хранилище сертификатов. В приложение можно включить код, позволяющий пользователю выбрать PFX-файл, содержащий сертификат клиента, а затем импортировать этот сертификат в хранилище сертификатов клиента.
Совет можно использовать makecert.exe для создания PFX-файла для использования с этим кратким руководством. Сведения об использовании makecert.exe см. в статье MakeCert.
Откройте Visual Studio и создайте проект с начальной страницы. Назовите новый проект FirstContosoBankApp. Нажмите кнопку ОК для создания проекта.
В файле 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"/>
Сохраните файл MainPage.xaml.
В файле 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;
В файле 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;
В файле 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(); }
В файле 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(); }
Запустите приложение и войдите в безопасную веб-службу, а также импортируйте PFX-файл в локальное хранилище сертификатов.
Эти действия можно использовать для создания нескольких приложений, использующих один и тот же сертификат пользователя для доступа к одинаковым или разным защищенным веб-службам.