在.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创建的开发证书。它位于当前用户证书下的个人证书:
右键点击选中项,转到“所有任务”,然后点击“导出”。在证书导出向导中,点击下一步,然后点击确定导出私钥,然后点击下一步。选择PFX格式,然后点击下一步。在这里,您需要设置密码,与上面代码中使用的密码完全相同。选择文件名和存储文件的位置,然后点击“下一步”。最后点击“完成”将证书保存到文件中。
注意:在生产环境,通常我们会把密码存储在某个配置中心,为了安全,建议密码不要硬编码。
回顾
以上只是一个小小的定制,我们是需要手动配置证书的,它适用于想在Docker上或没有IIS或NGINX的环境上面运行我们的程序,并且不担心证书存储等安全问题的场景,这种配置方法很灵活。另外,通常在IIS或NGINX等web服务器运行应用程序,我们无需关心ASP.NET Core 6.0
中的证书。
感谢您的阅读,在下一篇文章,我们将讨论如何配置ASP.NET Core
Web应用的宿主环境。