Система не может найти указанный файл - сертификат azure key vault

  • Я добавил сертификат pfx в хранилище ключей Azure.

  • У меня есть одно приложение asp.net web api, где через одну из конечных точек я пытаюсь получить доступ к информации о сертификате из хранилища ключей.

    public class ValuesController : ControllerBase
    {
         public async Task<string> Get()
     {
    
    
         AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider();
         var keyVaultClient = new KeyVaultClient(
             new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
    
         var secret = await keyVaultClient.GetSecretAsync("<certificateSecretIdentifier>").ConfigureAwait(false);
         X509Certificate2 certificateWithPrivateKey = new X509Certificate2(Convert.FromBase64String(secret.Value));
    
         return certificateWithPrivateKey.FriendlyName;
     }
    }
    
  • Я использую управляемую идентификацию Azure, и все настроено правильно.

  • Когда я запускаю веб-приложение в локальном IIS Express, ошибок нет, и конечная точка дает мне желаемый результат.

  • Теперь, когда я публикую веб-приложение через приложение Azure и приложение службы приложений и пытаюсь вызвать конечную точку, получаю эту ошибку,

Я добавил свое приложение-службу приложений с политиками доступа к хранилищу ключей Azure (получить, список), подскажите, в чем может быть причина?

2020-07-08 03:20:48.986 +00:00 [Ошибка] Microsoft.AspNetCore.Server.IIS.Core.IISHttpServer: идентификатор подключения "16717361818409901973", идентификатор запроса "80001f98-0000-e800-b63f-84710c7967bb": An Приложение сгенерировало необработанное исключение. Internal.Cryptography.CryptoThrowHelper+WindowsCryptographicException: система не может найти указанный файл. в Internal.Cryptography.Pal.CertificatePal.FilterPFXStore(Byte[] rawData, SafePasswordHandle пароль, PfxCertStoreFlags pfxCertStoreFlags) в Internal.Cryptography.Palrage.CertificatePal.FromBlobataStoreFlags, System.FromBlobatOrFagStoreFameFromBlobBag Security.Cryptography.X509Certificates.X509Certificate..ctor(байт [] данных) в System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(Byte[] rawData) на шлюзе.Controllers.ValuesController.Get() в C:\Work\AzureAdAuth\Gateway\Controllers\ValuesController.cs: строка 26 в lambda_method(Closure, Object) в Microsoft.Extensions.Internal.ObjectMethodExecutorAwaitable.Awaiter.GetResultNet () в Microsoft.AA.Mvc.Infrastructure.ActionMethodExecutor.AwaitableObjectResultExecutor.Execute(сопоставитель IActionResultTypeMapper, исполнитель ObjectMethodExecutor, контроллер объекта, аргументы Object []) в Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionActionInfrastructure.ControllerActionInfrastructure.ControllerActionInfrastructure.Controller 12, ValueInfrastructure.AwaitableObjectResultExecutor.Execute (сопоставитель IActionResultTypeMapper, исполнитель ObjectMethodExecutor, контроллер объекта, аргументы Object []) в Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|12_0(ControllerActionInvokerAwaitableObjectResultExecutor.Execute (сопоставитель IActionResultTypeMapper, исполнитель ObjectMethodExecutor, контроллер объекта, аргументы Object []) в Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|12_0(ControllerActionInvoker1 actionResultValueTask) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterAsync>g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeInnerFilterAsync>g__Awaited|13_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|19_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker) at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger) at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context) at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context) at Microsoft.AspNetCore.Server.IIS.Core.IISHttpContextOfT1.ProcessRequestAsync()

1 ответ

Решение

Для чтения PFX необходимо загрузить профиль пользователя. Когда мы добавилиWEBSITE_LOAD_CERTIFICATES, это в основном приводит к загрузке профиля в фоновом режиме и, следовательно, мы можем читать PFX из файловой системы.

ASP.NET и ASP.NET Core в Windows должны иметь доступ к хранилищу сертификатов, даже если вы загружаете сертификат из файла. Чтобы загрузить файл сертификата в приложение Windows .NET, добавьтеWEBSITE_LOAD_USER_PROFILE=1 в настройках приложения.

Для более подробной информации вы можете обратиться к этой статье.

Другие вопросы по тегам