我在天蓝色的密钥库中添加了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()
答案 0 :(得分:6)
读取PFX要求加载用户配置文件。当我们添加WEBSITE_LOAD_CERTIFICATES
时,基本上会导致在后台加载配置文件,因此我们可以从文件系统中读取PFX。
ASP.NET和ASP.NET Core必须访问证书存储,即使您从文件加载证书也是如此。要在Windows .NET应用程序中加载证书文件,请在应用程序的设置中添加WEBSITE_LOAD_USER_PROFILE=1
选项。
有关更多详细信息,请参阅此article。