Добавление определенного сертификата к HttpClient в .NET 6

Последние несколько дней я занимался проблемой, которая не давала мне покоя. Моя работа требует использования смарт-карты для авторизации доступа к некоторым внутренним службам. Это не проблема, когда я использую браузер вроде Chrome или Firefox, но становится проблемой, когда я хочу использовать эти службы через их API для автоматизации чего-то очень скучного.

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

Итак, необходимые шаги:

  1. Получить доступ к хранилищу сертификатов
  2. Найти мой сертификат
  3. Добавить его в HttpClient
  4. Успешно выполнить запрос

Кажется, все достаточно просто, так что давайте приступим к делу. Сначала мне нужно получить доступ к моему личному хранилищу сертификатов:

var store = new X509Store(StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
Войдите в полноэкранный режим Выйти из полноэкранного режима

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

var certificate = store.Certificates.First(cert => cert.IssuerName.Name == "ISSUER_NAME");
Войти в полноэкранный режим Выйти из полноэкранного режима

Эта строка находит первый сертификат с IssuerName, который соответствует нашим требованиям. Теперь, когда он у нас есть, давайте добавим его в клиент.
Для этого сначала нужно создать HttpClientHandler(), который затем будет использоваться для создания объекта HttpClient().

var clientHandler = new HttpClientHandler();
clientHandler.ClientCertificates.Add(certificate);
var client = new HttpClient(clientHandler);
Вход в полноэкранный режим Выход из полноэкранного режима

Как видите, между созданием обработчика и его использованием для создания клиента мы добавили в него сертификат. Теперь нам больше не нужно беспокоиться об этом, потому что Клиент будет использовать его по умолчанию.
Остальная работа заключается в выполнении запроса стандартным образом:

client.BaseAddress = new Uri("https://service.service");
var result = await client.GetAsync("/endpoint");
Войти в полноэкранный режим Выйти из полноэкранного режима

Этот запрос будет использовать наш добавленный сертификат для авторизации в сервисе, и все должно работать отлично. Проблема решена, и теперь я могу автоматизировать свои действительно скучные задачи — и вы тоже можете 😉

Эта статья была впервые опубликована в моем личном блоге https://rumpel.dev.

Оцените статью
devanswers.ru
Добавить комментарий