如何在ASP.NET Core 2.x中使用Kestrel与HTTPS/SSL?

63

我目前正在使用ASP.NET Core 2.x,我曾经可以通过将HTTPS/SSL放入UseUrls()方法中来让Kestrel使用它:

var host = new WebHostBuilder()
    .UseUrls("http://localhost", "https://111.111.111.111")
    .UseKestrel()
    .Build();

但是现在我遇到了异常:

 System.InvalidOperationException:
     HTTPS endpoints can only be configured using KestrelServerOptions.Listen().

如何在ASP.NET Core 2.x中配置Kestrel使用SSL?


2
请参考此文章 https://blogs.msdn.microsoft.com/webdev/2017/11/29/configuring-https-in-asp-net-core-across-different-platforms/ 以及完整的源代码 https://github.com/aspnet/samples/tree/master/samples/aspnetcore/security/KestrelHttps - natenho
2个回答

98

基础知识:使用服务器URL

如果您想将服务器关联到使用分配给服务器/网络主机的所有IP地址,则可以执行以下操作:

WebHost.CreateDefaultBuilder(args)
    .UseUrls("http://localhost:5000", "http://*:80")
    .UseStartup<Startup>()
    .Build();
注意:在UseUrls()方法中使用的字符串格式是:http://{ip address}:{port number}。 - 如果您在IP地址处使用*(星号),则表示主机上所有可用的IP地址。 - 端口号不是必需的。如果留空,它将默认为端口80。
有关UseUrls()方法的更多详细信息,请参阅此处的官方Microsoft Docs
然而,UseUrls()方法不能与SSL一起使用——这意味着,如果您尝试添加以https://开头的URL,则程序将抛出异常。
System.InvalidOperationException:
    HTTPS endpoints can only be configured using KestrelServerOptions.Listen().

端点配置。使用HTTPS并绑定SSL证书

只能使用KestrelServerOptions配置HTTPS端点。

以下是使用Listen方法使用TCP套接字的示例:

WebHost.CreateDefaultBuilder(args)
    .UseKestrel(options =>
    {
        options.Listen(IPAddress.Loopback, 5000);  // http:localhost:5000
        options.Listen(IPAddress.Any, 80);         // http:*:80
        options.Listen(IPAddress.Loopback, 443, listenOptions =>
        {
            listenOptions.UseHttps("certificate.pfx", "password");
        });
    })
    .UseStartup<Startup>()
    .Build();
注意:如果您同时使用Listen方法和UseUrls方法,则Listen端点将覆盖UseUrls端点。
有关设置端点的更多信息,请在此处查看官方Microsoft文档
如果您使用IIS,则IIS的URL绑定将覆盖通过调用ListenUseUrls设置的任何绑定。有关更多信息,请参见ASP.NET Core模块介绍

1
你可以提供如何生成 certificate.pfx 的信息,例如使用 https://andrewlock.net/creating-and-trusting-a-self-signed-certificate-on-linux-for-use-in-kestrel-and-asp-net-core/ 作为起点吗? - Andrei Rînea
1
@AndreiRînea - 这是一个非常广泛的问题。您可以购买SSL证书,也可以自行签名。该过程还取决于您的操作系统等因素。如果您使用Windows,可以查看certreq.exe或者您也可以使用IIS。 - Svek
7
Kestrel for ASP.NET Core 2足够安全,可以用于公共端点。而Kestrel for ASP.NET Core 1则不行。 - robrich
3
@robrich 这个说法有什么参考资料吗? - Anttu
4
前往https://learn.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?tabs=aspnetcore2x#when-to-use-kestrel-with-a-reverse-proxy,并在2.0和1.1选项卡之间切换。 - robrich
显示剩余10条评论

-1

你不需要单独使用kestrel实现https。如果你运行的应用程序需要https,很可能会面向互联网。这意味着你需要在nginx或Apache后面运行kestrel,并让其中一个为你处理https请求。


18
不是这样的。在很多情况下,Kestrel 的加密通信被用于内部或不通过公共端点进行托管。 - Svek
2
是的,内部使用是可以的。但是,论坛作者提到了https。因此,我认为它会面向外部。另外,仅仅因为有人在公共终端上使用kestrel,并不意味着这样做就是好的。根据我的经验,我从不相信Kestrel足够强大,足以面向公众。尤其是当Microsoft本身也不推荐这样做时。 - Michael
5
被踩了。需要Kestrel本身支持https的充足理由。根据Damian Edwards的说法,Kestrel现在是一个得到支持但未得到认证的边缘服务器。 - Rich S
8
@Michael,问题是“如何在ASP.NET Core 2.x中配置Kestrel以使用SSL?”,而答案“为什么不使用反向代理”并没有回答这个问题。 - Rich S
1
@CharlieFlowers,您可以在内部网络上使用带有SSL的Kestrel而无需边缘服务器: https://learn.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?view=aspnetcore-2.1&tabs=aspnetcore2x#when-to-use-kestrel-with-a-reverse-proxy - Rich S
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接