在.NET 6.0上使用Kestrel配置和自定义HTTPS

本章是《定制ASP NET 6.0框架系列文章》的第四篇。在本章,我们将学习ASP.NET Core的Kestrel配置和自定义HTTPS,好我们开始正文。

ASP.NET Core中,默认情况下HTTPS处于打开状态,这个不是问题,我们无需禁用它。因为如果你的服务是在防火墙后面,是属于后台服务,不对外网提供服务,启用HTTPS也是有意义的。.
通常,在Windows上,启用HTTPS所需的证书是从Windows证书存储库加载的,在Linux或Mac上,则会从证书文件上加载证书,后者更加灵活,是我比较推荐的方式。
本章包含两个主题:

  • Kestrel简介

  • 设置Kestrel

本文讨论的主题仍然属于ASP.NET Core的宿主(Host)层。

技术准备

我们通过终端生成一个ASP.NET Core MVC项目:

dotnet new mvc -n HttpSample -o HttpSample

然后用VS Code打开项目:

cd HttpSample 
code .

Kestrel简介

Kestrel是一个新实现的HTTP服务器,它是ASP.NET Core的托管引擎,这有别于在IIS上运行的经典的ASP.NET应用程序(在.NET Framework),据说微软的灵感来自Node.js,因为Node.js有一个名为libuv的HTTP服务器。在ASP.NET Core的第一个版本中,微软也使用了libuv,然后在其顶部添加了一个名为Kestrel的层。此时,Node.js 和ASP.NET Core 共享相同的HTTP服务器。

随着.NET Core 框架的不断发展和新的.NET Socket的实现,Microsoft基于.NET Socket构建了自己的HTTP服务器,同时删除了libuv,因为libuv不可控也不属于微软,这种重新造轮子的现象在大厂司空见惯。现在,Kestrel已经发展成熟,是一个能运行ASP.NET Core应用的微软系的HTTP服务器。
那么IIS现在的角色是什么呢?IIS充当起了反向代理,将流量转发给Kestrel并管理Kestrel进程。在Linux上,我们通常使用NGINX作为Kestrel的反向代理。

设置Kestrel

接下来,我们需要稍微重写默认的WebHostBuilder来设置Kestrel。使用ASP.NET Core 3.0及更高版本,Kestrel属于框架默认的配置,当然我们可以进行自定义配置。

我们看下配置步骤:
1.配置Kestrel

我们先看一下在3.0-5.0版本中,如何手动添加和配置Kestrel

{
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder
                        .UseKestrel(options =>
                        {
                           //待配置
                        })
                        .UseStartup<Startup>();
                });
    }

上面的代码演示了如何在IWebHostBuilder上调用UseKestrel()方法进行配置,我们再看下.NET Core 6.0中的配置方法:

var builder = WebApplication.CreateBuilder(args);

builder.WebHost.UseKestrel(options =>{    //待配置});

UseKestrel()方法看,新旧版本没有任何区别,只是新版本的极简理念让代码更加可读。

别忘了,我们还要引入System.Net名称空间,用以解析IPAddress

2.配置证书

了解了Kestrel的配置格式,我们来看下具体配置内容:

builder.WebHost.UseKestrel(options =>{
    options.Listen(IPAddress.Loopback, 5000);
    options.Listen(IPAddress.Loopback,  5001,  
     listenOptions  =>
    {
        listenOptions.UseHttps("certificate.pfx","topsecret");
    });
});

UseKestrel()方法里面,我们配置了要侦听的地址和端口,对于HTTPS端口5001,我们还需要配置如何加载证书certificate.pfx

3.创建证书

下面要创建一个证书文件。我们打开证书存储库并导出Visual Studio创建的开发证书。它位于当前用户证书下的个人证书:
在.NET 6.0上使用Kestrel配置和自定义HTTPS

右键点击选中项,转到“所有任务”,然后点击“导出”。在证书导出向导中,点击下一步,然后点击确定导出私钥,然后点击下一步。选择PFX格式,然后点击下一步。在这里,您需要设置密码,与上面代码中使用的密码完全相同。选择文件名和存储文件的位置,然后点击“下一步”。最后点击“完成”将证书保存到文件中。

注意:在生产环境,通常我们会把密码存储在某个配置中心,为了安全,建议密码不要硬编码。

回顾

以上只是一个小小的定制,我们是需要手动配置证书的,它适用于想在Docker上或没有IIS或NGINX的环境上面运行我们的程序,并且不担心证书存储等安全问题的场景,这种配置方法很灵活。另外,通常在IIS或NGINX等web服务器运行应用程序,我们无需关心ASP.NET Core 6.0中的证书。
感谢您的阅读,在下一篇文章,我们将讨论如何配置ASP.NET CoreWeb应用的宿主环境。