Arhn - архитектура программирования

Как подписать токен JWT в веб-задании Azure, не получая CryptographicException?

У меня есть веб-задание, которому нужно создать токен JWT для связи с внешней службой. Следующий код работает, когда я запускаю WebJob на своем локальном компьютере:

public static string SignES256(byte[] p8Certificate, object header, object payload)
{
    var headerString = JsonConvert.SerializeObject(header);
    var payloadString = JsonConvert.SerializeObject(payload);

    CngKey key = CngKey.Import(p8Certificate, CngKeyBlobFormat.Pkcs8PrivateBlob);
    using (ECDsaCng dsa = new ECDsaCng(key))
    {
        dsa.HashAlgorithm = CngAlgorithm.Sha256;
        var unsignedJwtData = Base64UrlEncoder.Encode(Encoding.UTF8.GetBytes(headerString)) + "." + Base64UrlEncoder.Encode(Encoding.UTF8.GetBytes(payloadString));
        var signature = dsa.SignData(Encoding.UTF8.GetBytes(unsignedJwtData));
        return unsignedJwtData + "." + Base64UrlEncoder.Encode(signature);
    }
}

Однако при развертывании веб-задания в Azure я получаю следующее исключение:

Microsoft.Azure.WebJobs.Host.FunctionInvocationException: Исключение при выполнении функции: NotificationFunctions.QueueOperation ---> System.Security.Cryptography.CryptographicException: системе не удается найти указанный файл. в System.Security.Cryptography.NCryptNative.ImportKey(поставщик SafeNCryptProviderHandle, Byte[] keyBlob, формат String) в System.Security.Cryptography.CngKey.Import(Byte[] keyBlob, формат CngKeyBlobFormat, поставщик CngProvider)

Он говорит, что не может найти указанный файл, но параметры, которые я передаю, не смотрят на местоположение файла, они находятся в памяти. Из того, что я собрал, может быть какой-то параметр криптографии, который мне нужно включить, чтобы иметь возможность использовать метод CngKey.Import, но я не могу найти какие-либо параметры на портале Azure для настройки, связанные с этим.

Я также пытался использовать JwtSecurityTokenHandler, но, похоже, он не обрабатывает алгоритм хеширования ES256, который мне нужно использовать (хотя в классе JwtAlgorithms он упоминается как ECDSA_SHA256).

Мы ценим любые предложения!

ОБНОВЛЕНИЕ

Похоже, что CngKey.Import на самом деле может пытаться сохранить сертификат где-то, недоступном в Azure. Мне не нужно его хранить, поэтому, если есть лучший способ получить доступ к сертификату в памяти или преобразовать его в сертификат другого типа, который будет проще использовать, это сработает.

ОБНОВЛЕНИЕ 2

Эта проблема может быть связана с параметром IIS Azure Web Apps, который не загружает профиль пользователя, как указано здесь. Я включил это, установив WEBSITE_LOAD_USER_PROFILE = 1 в настройках приложения портала Azure. Я пытался использовать это обновление при запуске кода как через веб-задание, так и через веб-приложение в Azure, но по-прежнему получаю ту же ошибку.

11.04.2017

  • Показывает ли он ту же ошибку, если вы пытаетесь запустить его локально на своем компьютере? 11.04.2017
  • Нет, локально на моей машине, работающей как WebJob, работает как положено, никаких исключений не выдается. 11.04.2017
  • Где вы импортировали свой сертификат? я имею в виду на азуре 12.04.2017
  • Сертификат представляет собой файл Pkcs8, который в настоящее время у меня есть как строка base64 в моем web.config (возможно, не лучшее место для него) и загружается в массив байтов. Это переменная p8Certificate, переданная в метод. 12.04.2017

Ответы:


1

Я использовал декомпилятор, чтобы заглянуть под капот, что на самом деле делает метод CngKey.Import. Похоже, он пытается вставить сертификат, который я использую, в «Поставщик хранилища ключей программного обеспечения Microsoft». На самом деле мне это не нужно, просто нужно прочитать значение сертификата, но не похоже, что это возможно.

Как только я понял, что сертификат вставляется в хранилище где-то на одном компьютере, я начал думать о том, насколько плохим было бы думать, что это было бы с точки зрения безопасности, если бы ваше веб-приложение Azure работало в общей среде, как это происходит для Free и Общие уровни. Конечно же, моя виртуальная машина находилась на общем уровне. Масштабирование до базового уровня решило эту проблему.

12.04.2017
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..