系统找不到指定的文件-天蓝色密钥库证书

时间:2020-07-08 03:36:00

标签: azure-web-app-service azure-keyvault asp.net-core-3.1 azure-managed-identity

  • 我在天蓝色的密钥库中添加了pfx证书。

  • 我有一个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中运行Web应用程序时,没有错误,端点给了我想要的结果。

  • 现在,当我通过azure和应用程序服务应用程序发布Web应用程序并尝试调用端点时,出现此错误,

我已在我的应用服务应用程序中添加了天蓝色密钥库的访问策略(获取,列出),请提出原因?

2020-07-08 03:20:48.986 +00:00 [错误] Microsoft.AspNetCore.Server.IIS.Core.IISHttpServer:连接ID“ 16717361818409901973”,请求ID“ 80001f98-0000-e800-b63f-84710c7967bb ”:应用程序引发了未处理的异常。 Internal.Cryptography.CryptoThrowHelper + WindowsCryptographicException:系统找不到指定的文件。 在Internal.Cryptography.Pal.CertificatePal.FilterPFXStore处(字节[] rawData,SafePasswordHandle密码,PfxCertStoreFlags pfxCertStoreFlags) 在Internal.Cryptography.Pal.CertificatePal.FromBlobOrFile(Byte [] rawData,String fileName,SafePasswordHandle password,X509KeyStorageFlags keyStorageFlags)中 在System.Security.Cryptography.X509Certificates.X509Certificate..ctor(Byte [] data) 在System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(Byte [] rawData) 在C:\ Work \ AzureAdAuth \ Gateway \ Controllers \ ValuesController.cs:第26行中的Gateway.Controllers.ValuesController.Get() 在lambda_method(Closure,Object) 在Microsoft.Extensions.Internal.ObjectMethodExecutorAwaitable.Awaiter.GetResult() 在Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.AwaitableObjectResultExecutor.Execute(IActionResultTypeMapper映射器,ObjectMethodExecutor执行器,对象控制器,Object []参数) 在Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited | 12_0(ControllerActionInvoker调用程序,ValueTask 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 个答案:

答案 0 :(得分:6)

读取PFX要求加载用户配置文件。当我们添加WEBSITE_LOAD_CERTIFICATES时,基本上会导致在后台加载配置文件,因此我们可以从文件系统中读取PFX。

Windows上的

ASP.NET和ASP.NET Core必须访问证书存储,即使您从文件加载证书也是如此。要在Windows .NET应用程序中加载证书文件,请在应用程序的设置中添加WEBSITE_LOAD_USER_PROFILE=1选项。

有关更多详细信息,请参阅此article