配置Kestrel HTTPS的.NET Core Web API部署为Windows服务启动报错
问题根因
- 运行身份差异:Visual Studio运行时使用当前登录的Windows用户身份,该用户下已安装信任开发证书,也有权限读取硬编码的
c:\certs\bella.pfx文件。但Windows服务默认使用Local System本地系统账户运行,该账户的证书存储区没有对应的开发证书,同时如果c:\certs目录未给Local System开放读取权限,也会无法读取pfx文件。 - Kestrel配置优先级冲突:同时在
Program.cs里硬编码了Kestrel监听规则,又在appsettings.json里配置了Kestrel节点,默认配置下appsettings的配置优先级高于代码硬编码,你在appsettings的HTTPS节点下仅配置了AllowInvalid,未指定证书路径和密码,导致Kestrel优先读取appsettings配置时找不到证书触发报错。 - launchSettings.json不生效:该文件仅在本地开发调试场景(VS启动、dotnet run命令执行)下加载,作为Windows服务运行时不会读取该文件的配置,包括里面指定的
ASPNETCORE_ENVIRONMENT环境变量也不会生效,如果证书配置写在appsettings.Development.json中,服务默认读取Production环境配置,也会出现找不到证书的问题。
解决步骤
1. 修复Kestrel配置冲突
二选一即可:
- 方案一:删除
appsettings.json里的整个Kestrel配置节点,让Kestrel直接使用Program.cs里的硬编码配置 - 方案二:补全appsettings里的HTTPS证书配置,删除Program.cs里的
ConfigureKestrel代码段,appsettings的HTTPS节点补全为:
"HTTPS": { "Url": "https://localhost:9124", "ClientCertificateMode": "NoCertificate", "Protocols": "Http1AndHttp2", "SslProtocols": [ "Tls13", "Tls12", "Tls11", "Tls" ], "Certificate": { "Path": "c:\\certs\\bella.pfx", "Password": "Asd.Zxc1@#", "AllowInvalid": true } }
2. 配置服务运行权限
二选一即可:
- 方案一:打开Windows服务管理器(运行输入
services.msc),找到服务DFPS_WP,右键选择「属性」→「登录」选项卡,选择「此账户」,输入当前登录Windows的用户名和密码,点击确定后重启服务即可 - 方案二:给Local System账户开放
c:\certs目录的读取权限:右键c:\certs文件夹→「属性」→「安全」→「编辑」→「添加」,依次输入LOCAL SERVICE和SYSTEM,分别给两个账户勾选「读取和执行」「列出文件夹内容」「读取」权限,保存后重启服务。
3. 可选环境配置
如果需要指定服务运行在Development环境,可以在安装服务时添加启动参数,或者在服务属性的「常规」选项卡的「可执行文件的路径」末尾添加 --environment Development即可。
内容的提问来源于stack exchange,提问作者Martin Spasovski
相关产品推荐
相关产品推荐

