如何在应用发布包外配置Kestrel的HTTPS?
有两种主要方式可以通过dotnet run实现和你给出的appsettings.json等效的配置,不需要修改代码或依赖appsettings.json:
一、直接通过命令行参数传递配置
.NET的配置系统允许通过命令行参数直接覆盖Kestrel的配置项,格式是把JSON中的层级用冒号:分隔。对应你给出的配置,完整的dotnet run命令如下:
dotnet run --Kestrel:EndPoints:Http:Url "http://example.com:80" --Kestrel:EndPoints:Https:Url "https://example.com:443" --Kestrel:EndPoints:Https:Certificate:Subject "example.com" --Kestrel:EndPoints:Https:Certificate:Store "webhosting" --Kestrel:EndPoints:Https:Certificate:Location "LocalMachine"
如果只需要启用HTTP或HTTPS其中一个,去掉对应的参数即可——比如开发环境只需要HTTP的话,只传--Kestrel:EndPoints:Http:Url "http://localhost:5000"或者更简洁的--urls "http://localhost:5000"。
二、通过环境变量配置(适合持久化宿主环境配置)
如果不想每次运行都输入长命令,可以用环境变量来设置这些配置项,不同系统的环境变量命名规则略有差异:
- Windows(CMD):把冒号
:换成下划线_,比如set Kestrel_EndPoints_Https_Certificate_Subject=example.com - Linux/macOS:把冒号
:换成双下划线__,比如export Kestrel__EndPoints__Https__Certificate__Subject=example.com
设置好所有需要的环境变量后,直接运行dotnet run即可自动读取这些配置。
补充说明
- 命令行参数的优先级高于appsettings.json和环境变量,若同时存在会以命令行参数为准。
- 开发环境不需要HTTPS时,完全可以不传递任何HTTPS相关参数,Kestrel会默认只启用HTTP端点(或用
--urls指定HTTP地址)。 - 使用证书存储方式时,要确保运行
dotnet run的用户有访问对应证书存储的权限(比如LocalMachine存储需要管理员权限)。
内容的提问来源于stack exchange,提问作者BenderBoy
相关产品推荐
相关产品推荐

