在.NET 6.0上使用Kestrel設定和自定義HTTPS

2022-06-29 12:01:35

大家好,我是張飛洪,感謝您的閱讀,我會不定期和你分享學習心得,希望我的文章能成為你成長路上的墊腳石,讓我們一起精進。

本章是《客製化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應用的宿主環境。