Система не может найти указанный файл - сертификат 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(ControllerActionInvoker
1 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.IISHttpContextOfT
1.ProcessRequestAsync()
1 ответ
Для чтения PFX необходимо загрузить профиль пользователя. Когда мы добавилиWEBSITE_LOAD_CERTIFICATES
, это в основном приводит к загрузке профиля в фоновом режиме и, следовательно, мы можем читать PFX из файловой системы.
ASP.NET и ASP.NET Core в Windows должны иметь доступ к хранилищу сертификатов, даже если вы загружаете сертификат из файла. Чтобы загрузить файл сертификата в приложение Windows .NET, добавьтеWEBSITE_LOAD_USER_PROFILE=1
в настройках приложения.
Для более подробной информации вы можете обратиться к этой статье.