使用指纹为 Windows 服务托管 ASP.NET Core Web 应用程序设置生产证书

问题描述 投票:0回答:1

我有一个使用本教程创建的 Windows 服务托管 Web 应用程序(Web 应用程序作为 Windows 服务部分): https://csharp.christiannagel.com/2022/03/22/windowsservice-2/

到目前为止一切正常。我需要为此应用程序设置 HTTPS 端点,但在尝试启动服务后我总是收到相同的错误消息(详细信息如下)。

下一步,我需要使用指纹在

appsettings.json
中为此应用程序设置 HTTPS 端点:

"Kestrel": {
    "Endpoints": {
      "Http": {
        "Url": "http://*:5010"
      },
      "Https": {
        "Url": "https://*:5011",
        "Certificate": {
          "Thumbprint": "D24422F5A62359FAD4B18EBE27A5C14735879333",
          "Store": "My",
          "Location": "LocalMachine",
          "AllowInvalid": "false"
        }
      }
   }
}

该证书是 DigiCert 签名的生产证书(不是开发人员证书)。

我使用 certlm GUI 将其导入到

LocalMachine\My store
。我从商店读取了指纹并设置为
appsettings.json

每次我尝试使用这些设置启动服务时,它都会在 2-3 秒后停止,并且我在事件日志中看到以下错误:

CoreCLR 版本:6.0.2023.32017
.NET版本:6.0.20
描述:由于未处理的异常,进程被终止。
异常信息:System.InvalidOperationException:无法配置 HTTPS 端点。未指定服务器证书,默认开发者证书找不到或已过期。 要生成开发人员证书,请运行“dotnet dev-certs https”。要信任证书(仅限 Windows 和 macOS),请运行“dotnet dev-certs https --trust”。
有关配置 HTTPS 的更多信息,请参阅 https://go.microsoft.com/fwlink/?linkid=848054

在 Microsoft.AspNetCore.Server.Kestrel.KestrelConfigurationLoader.Reload()
在 Microsoft.AspNetCore.Server.Kestrel.KestrelConfigurationLoader.Load()
在 Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.BindAsync(CancellationToken CancellationToken)
在 Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.StartAsync[TContext](IHttpApplication`1 应用程序,CancellationToken CancellationToken)
在 Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken CancellationToken)
在 Microsoft.Extensions.Hosting.Internal.Host.StartAsync(CancellationToken CancellationToken)
在 Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost 主机,CancellationToken 令牌)
在 Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost 主机,CancellationToken 令牌)
在 Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.Run(IHost 主机)
在 Microsoft.AspNetCore.Builder.WebApplication.Run(字符串 url)
在 Program.$(String[] args)

我尝试了所有设置组合并将其安装到另一家商店等。错误总是相同的。

当我使用 PFX 文件设置证书时,唯一有效的方法是:

"Kestrel": {
   "Endpoints": {
      "Http": {
        "Url": "http://*:5010"
      },
      "Https": {
        "Url": "https://*:5011",
        "Certificate": {
            "Path": "C:\\CERT\\MY.pfx",
            "Password": "Pass1234"
        }
      }
   }
}

但是我不能这样做,我必须使用指纹而不是硬编码的密码。

证书的权限设置为Everyone(用于测试),但没有任何变化。

你能帮我一下吗?我怎样才能让它工作?谢谢!

asp.net-core ssl-certificate windows-services asp.net-core-webapi appsettings
1个回答
0
投票

根据本文档,没有通过指纹选择证书的选项https://learn.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel/endpoints?view=aspnetcore-7.0#listenoptionsusehttps。这也在这里讨论。 https://github.com/dotnet/aspnetcore/issues/4385.

您可以使用按主题(CN)选择证书的选项。 找到“主题”值并按如下方式使用。

        "Certificate": {
          "Subject": "xxxxxx",
          "Store": "My",
          "Location": "LocalMachine",
          "AllowInvalid": "false"
        }

然后就可以了。

© www.soinside.com 2019 - 2024. All rights reserved.