在.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.jsASP.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 CoreWeb應用的宿主環境。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章