【发布时间】:2022-12-11 05:06:01
【问题描述】:
服务器名称指示是一个很好的功能,在 Http.sys 内核模式驱动程序和 IIS 中运行良好。但是如何让它与 ASP.NET Core 中的 HTTP.sys Web 服务器实现一起工作呢? https://learn.microsoft.com/en-us/aspnet/core/fundamentals/servers/httpsys?source=recommendations&view=aspnetcore-6.0 上的文档明确指出支持带有 SNI 的 HTTPS,但我不知道如何去做。 我的问题:在一台服务器上我有:
- 在 IIS 中运行的 HTTPS 网站;
- 运行 HTTP.sys 实现的 ASP.NET Core 应用程序。
所有站点和应用程序都需要侦听 443 端口并使用单独的 SSL 证书。
IIS 中的 SNI 配置很容易通过 Require Server Name Indication 选项完成。由于 SNI,每个站点都可能有自己的证书并在单个 443 端口上侦听。
但是应用程序呢?我可以使用 UrlPrefixes 属性绑定它:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseHttpSys(options =>
{
options.UrlPrefixes.Add("https://example.com:443");
});
webBuilder.UseStartup<Startup>();
})
但是我不能在这里指定证书。 我知道可以指定证书netsh.exe工具:
netsh http add sslcert ipport=<IP>:<PORT> certhash=<THUMBPRINT> appid="{<GUID>}"
但它会覆盖 IIS 中的证书绑定,并且网站会停止通过 HTTPS 工作。只能为每个 IP/端口组合指定一个证书,因此我不能在此处指定多个证书。但正如 SNI 支持所暗示的那样,我需要拥有多个证书。 所以标题中的问题仍然存在:ASP.NET Core 中的 HTTP.sys Web 服务器实现是否真的支持服务器名称指示(SNI)?如何?
我尝试使用 Kestrel 配置选项提供证书,但它们显然在我使用 Http.sys 时不起作用:
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureEndpointDefaults(listenOptions =>
{
listenOptions.UseHttps("c:\\mycert\\cert.pfx", "pwd");
});
});
【问题讨论】:
标签: asp.net-core sni http.sys