我试图通过其appsettings.json配置文件在 Linux 环境中的基于 ASP.NET Core MVC 的服务应用程序中设置 Kestrel 服务器,以便它恰好有两个端点,都使用 HTTPS,但每个端点都具有不同的证书。一个端点监听0.0.0.0,另一个只监听localhost。该服务充当 IdentityServer4 的主机。服务器的预期运行时环境将是一个 Docker 容器,它是基于多服务的系统的一部分,目前作为 docker-compose 集群运行。
我已经研究了https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?view=aspnetcore-2.2#endpoint-configuration 上的官方文档,并认为它应该很容易实现。我创建了一个自签名根 CA 证书并生成了两个由根签名的证书。其中之一将 Common Name 设置为容器在集群中的名称,用于与外部环境的安全通信。另一个证书将 CN 设置为localhost并使用,因为服务器有多个可从外部使用的控制器,它们都将转换传入请求并转发到将处理它们的特殊内部控制器。(我意识到这对我来说有点偏执,但这无关紧要。)
我尝试配置 Kestrel,以便主端点使用默认证书,localhost端点使用临时证书,即像这样:
"Kestrel": {
"Endpoints": {
"Https": {
"Url": "https://+:2051"
},
"HttpsLocalhost": {
"Url": "https://localhost:2052",
"Certificate:": {
"Path": "path/to/localhost-dev.pfx",
"Password": "password"
}
}
},
"Certificates": {
"Default": {
"Path": "path/to/identity-api-dev.pfx",
"Password": "password"
}
}
}
Run Code Online (Sandbox Code Playgroud)
根据文档,这似乎是正确的配置,其中说如果明确配置 HTTPS,服务器需要定义默认证书。
外向控制器使用延迟初始化HttpClient,其BaseAddress属性在第一个接收到的请求上初始化,并带有localhost …