【问题标题】:Why can't Azure App Service find my GoDaddy certificate?为什么 Azure 应用服务找不到我的 GoDaddy 证书?
【发布时间】:2021-07-14 23:01:54
【问题描述】:

我有一个运行 .NET Core 3.1 应用程序的 Azure 应用服务,使用 IdentityServer4 进行身份验证。

我的appsettings.json 文件如下所示:

...
"IdentityServer": {
  "Clients": {
    "MyApp": {
      "Profile": "IdentityServerSPA"
    }
  },
  "Key": {
    "Type": "Store",
    "StoreName": "My",
    "StoreLocation": "CurrentUser",
    "Name": "CN=mydomain.com"
  }
},
...

我通过 GoDaddy 创建了一个具有以下(假)值的证书:

  • 指纹:my-thumbprint
  • 主题名称:app.mydomain.com,www.app.mydomain.com

此证书作为私钥证书上传到我的应用服务,并且还存储在 Azure Key Vault 中(在自定义域绑定配置期间)。

在我的应用服务配置设置中,我有以下设置:

  • WEBSITE_LOAD_CERTIFICATES: my-thumbprint
  • IdentityServer__Key__Name: CN=app.mydomain.com,www.app.mydomain.com

我的应用无法启动。启动 Azure 应用服务控制台并运行命令

dotnet myapp.dll

导致以下堆栈跟踪:

Unhandled exception. System.InvalidOperationException: Couldn't find a valid certificate with subject 'CN=app.addtheand.com,www.app.addtheand.com' on the 'CurrentUser\My'
   at Microsoft.AspNetCore.ApiAuthorization.IdentityServer.SigningKeysLoader.LoadFromStoreCert(String subject, String storeName, StoreLocation storeLocation, DateTimeOffset currentTime)
   at Microsoft.AspNetCore.ApiAuthorization.IdentityServer.ConfigureSigningCredentials.LoadKey()
   at Microsoft.AspNetCore.ApiAuthorization.IdentityServer.ConfigureSigningCredentials.Configure(ApiAuthorizationOptions options)
   at Microsoft.Extensions.Options.OptionsFactory`1.Create(String name)
   at Microsoft.Extensions.Options.OptionsManager`1.<>c__DisplayClass5_0.<Get>b__0()
   at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode)
   at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor)
   at System.Lazy`1.CreateValue()
   at System.Lazy`1.get_Value()
   at Microsoft.Extensions.Options.OptionsCache`1.GetOrAdd(String name, Func`1 createOptions)
   at Microsoft.Extensions.Options.OptionsManager`1.Get(String name)
   at Microsoft.Extensions.Options.OptionsManager`1.get_Value()
   at Microsoft.Extensions.DependencyInjection.IdentityServerBuilderConfigurationExtensions.<>c.<AddClients>b__7_1(IServiceProvider sp)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory(FactoryCallSite factoryCallSite, RuntimeResolverContext context)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite, RuntimeResolverContext context, ServiceProviderEngineScope serviceProviderEngine, RuntimeResolverLock lockType)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitRootCache(ServiceCallSite singletonCallSite, RuntimeResolverContext context)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, RuntimeResolverContext context)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitDisposeCache(ServiceCallSite transientCallSite, RuntimeResolverContext context)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, RuntimeResolverContext context)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitDisposeCache(ServiceCallSite transientCallSite, RuntimeResolverContext context)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Resolve(ServiceCallSite callSite, ServiceProviderEngineScope scope)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine.<>c__DisplayClass1_0.<RealizeService>b__0(ServiceProviderEngineScope scope)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType)
   at Microsoft.AspNetCore.Builder.IdentityServerApplicationBuilderExtensions.TestService(IServiceProvider serviceProvider, Type service, ILogger logger, String message, Boolean doThrow)
   at Microsoft.AspNetCore.Builder.IdentityServerApplicationBuilderExtensions.Validate(IApplicationBuilder app)
   at Microsoft.AspNetCore.Builder.IdentityServerApplicationBuilderExtensions.UseIdentityServer(IApplicationBuilder app, IdentityServerMiddlewareOptions options)

我错过了什么?

我的应用在 DEV 模式下按预期运行,该模式使用 appsettings.json 中的 IdentityServer 配置,无需修改,加载/使用不同的自签名证书。

更新

我检查了证书是否已加载到应用服务机器,但没有找到。

找到这个的步骤:

  1. 从 Azure 门户中的应用服务,启动 kudo
  2. 在 kudo 中,选择 Debug Console -> Powershell
  3. 运行以下命令:dir cert:\localmachine\my

更新 2

由于我尝试通过 CurrentUser 加载证书,因此我在 powershell 终端中运行了以下命令:dir cert:\CurrentUser\My,发现主题与我在 Azure 门户中看到的不匹配。

  • 门户中的主题:app.mydomain.com,www.app.mydomain.com
  • 输出中的主题:CN=app.mydomain.com, OU=Domain Co...

【问题讨论】:

    标签: .net azure asp.net-core azure-web-app-service identityserver4


    【解决方案1】:

    跟进更新 2...

    我通过 UI 查看证书时在 Azure 门户中看到的 主题 与通过 kudo 的 Powershell 控制台运行 dir cert:\CurrentUser\my 命令时看到的不匹配是我的来源问题。

    为了解决这个问题,我根据 Portal UI 从主题中更改了IdentityServer__Key__Name 的配置值

    CN=app.mydomain.com,www.app.mydomain.com
    

    根据上面的命令

    CN=app.mydomain.com, OU=Domain Control Validated
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-27
      • 1970-01-01
      • 2020-08-23
      • 2016-07-05
      • 1970-01-01
      • 2017-12-01
      • 2018-10-08
      • 1970-01-01
      相关资源
      最近更新 更多