Невозможно создать CngKey из файла PEM в C# - PullRequest
0 голосов
/ 20 марта 2020

Я пытаюсь создать CngKey in. NET 4.7.2 из файла PEM, чтобы я мог подписать Apple-токен JWT авторизации.

В dev все работало нормально, но когда Я развернулся на стадии подготовки. При вызове CngKey.Import() мне встретилась «ошибка файла не найдена». Конечно. Приложение работает под некоторым пользователем пула приложений IIS без структуры пользовательского каталога для ОС, в которой хранятся ключи.

С тех пор я пытался использовать CngKey.Create() для импорта ключа на уровне компьютера, но Я продолжаю получать следующую бесполезную ошибку:

System.Security.Cryptography.CryptographicException: 'The requested operation is not supported.'

This exception was originally thrown at this call stack:
System.Security.Cryptography.NCryptNative.SetProperty(Microsoft.Win32.SafeHandles.SafeNCryptHandle, string, byte[], System.Security.Cryptography.CngPropertyOptions)
System.Security.Cryptography.CngKey.SetKeyProperties(Microsoft.Win32.SafeHandles.SafeNCryptKeyHandle, System.Security.Cryptography.CngKeyCreationParameters)
System.Security.Cryptography.CngKey.Create(System.Security.Cryptography.CngAlgorithm, string, System.Security.Cryptography.CngKeyCreationParameters)
SigningTest.Program.MachineKey() in Program.cs
SigningTest.Program.Main() in Program.cs

Вот мой текущий код:

var keyParameters = new CngKeyCreationParameters
{
    ExportPolicy = CngExportPolicies.AllowPlaintextExport,
    KeyCreationOptions = CngKeyCreationOptions.MachineKey,
    KeyUsage = CngKeyUsages.AllUsages,
    Provider = CngProvider.MicrosoftSoftwareKeyStorageProvider,
    UIPolicy = new CngUIPolicy(CngUIProtectionLevels.None)
};

// KeyMeat is the part of the PEM file between "-----BEGIN PRIVATE KEY-----" and "-----END PRIVATE KEY-----"
var keyBytes = Convert.FromBase64String(KeyMeat); 

keyParameters.Parameters.Add(new CngProperty(
    CngKeyBlobFormat.GenericPrivateBlob.Format,
    keyBytes,
    CngPropertyOptions.None)
);

var privateKey = CngKey.Create(CngAlgorithm.ECDsaP256, "someName", keyParameters);

Обратите внимание, что ошибка возникает в CngKey.Create(), но только когда keyParameters.Parameters.Add() нет закомментировано.

1 Ответ

0 голосов
/ 25 марта 2020

Откройте IIS и укажите LoadUserProfile для своего пула: В качестве альтернативы вы можете открыть AppSettings в вашем IIS и установить

WEBSITE_LOAD_USER_PROFILE = 1
...