使用 Kestrel 爲你的 ASP.NET Core 服務添加 https 支持

Kestrel 是一個跨平臺的適用於 ASP.NET Core 的 Web 服務器。它內置集成在了 ASP.NET Core 項目模板中,所以編寫和對外開放一個 Web 服務會非常簡單。

雖然不推薦直接使用 Kestrel 對外提供 Web 服務,但爲了簡單的話,臨時使用也是非常不錯的選擇。


Kestrel 是一個跨平臺的適用於 ASP.NET Core 的 Web 服務器。

Kestrel 只是一個 Web 服務器,能夠提供對外的 Web 服務;但它沒有反向代理功能。也就是說當你使用 Kestrel 指定了一個端口後,這個端口的所有流量將被 Kestrel 處理,不能再與其他 Web 服務程序共用端口了。當然還有一些其他的原因(比如 Web 安全防護),所以通常並不推薦直接使用 Kestrel 對外提供 Web 服務。

但有一點——Kestrel 內置集成在了 ASP.NET Core 項目模板中,所以編寫和對外開放一個 Web 服務會非常簡單,這也使得 Kestrel 值得被臨時使用一下。

配置 Kestrel

當你使用 dotnet 命令或者 Visual Studio 創建 ASP.NET Core 項目後,在 ConfigureWebHostDefaults 擴展方法的委託參數中,使用 webBuilder 對象可以用來配置 Kestrel 服務器。

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

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
++              webBuilder.ConfigureKestrel(serverOptions =>
++              {
++                  // 在這裏設置 Kestrel 的一些配置屬性。
++              })
                .UseStartup<Startup>();
            });

配置 https

配置 Kestrel 時,只需要調用 serverOptionsListen 方法設置監聽的 IP 和端口。並且,可以額外寫一個委託用來設置監聽參數。

使用 listenOptions.UseHttps 即可使用 SSL 證書來支持 https 協議。

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.ConfigureKestrel(serverOptions =>
                {
++                  serverOptions.Listen(IPAddress.Any, 5000, listenOptions =>
++                  {
++                      listenOptions.UseHttps(
++                          @"D:\blog.walterlv.com\ssl\blog-walterlv-com.pfx",
++                          "Hqh#Q*QqV%@aCnx41UB%M31H");
++                  });
                })
                .UseStartup<Startup>();
            });

這種把密碼寫在代碼中的做法一定要拖出去打

不過我需要做博客中介紹以下這裏是傳入密碼的,你可以採用其他的方式將密碼存起來。比如放入 Windows 憑據管理器中,或者以其他加密的方式存在服務器/個人電腦上。

如果不指定證書,也可以使用 https,不過這使用的是默認的配置,只能用在 localhost 中。

另外,如果你還沒有 SSL 證書,可以先閱讀我的另一篇博客瞭解如何申請免費的 SSL 證書:

至此,你的 ASP.NET Core 服務已經可以通過 https 對外提供服務了。

更多配置

除了在 Startup 中使用上文提供的配置代碼之外,還可以爲 https 配置其他參數。

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.ConfigureEndpointDefaults(listenOptions =>
    {
        // 配置終結點
    });

    serverOptions.ConfigureHttpsDefaults(listenOptions =>
    {
        listenOptions.SslProtocols = SslProtocols.Tls12;
    });
});

如果你的 Kestrel 服務面向多個域名,那麼也可以配置不同的域名使用不同的證書配置:

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.Listen(IPAddress.Any, 5000, listenOptions =>
    {
        listenOptions.UseHttps(httpsOptions =>
        {
            var certificates = new Dictionary<string, X509Certificate2>(StringComparer.OrdinalIgnoreCase)
            {
                {
                    "localhost",
                    CertificateLoader.LoadFromStoreCert("localhost", "My", StoreLocation.CurrentUser, true)
                },
                {
                    "walterlv.com",
                    CertificateLoader.LoadFromStoreCert("walterlv.com", "My", StoreLocation.CurrentUser, true)
                },
                {
                    "blog.walterlv.com",
                    CertificateLoader.LoadFromStoreCert("blog.walterlv.com", "My", StoreLocation.CurrentUser, true)
                }
            };

            httpsOptions.ServerCertificateSelector = (connectionContext, name) =>
                name != null && certificates.TryGetValue(name, out var cert)
                    ? cert
                    : certificates["walterlv.com"];
        });
    });
})

使用更強大的方法配置 https

其實我本不應該在博客後面貼上“更多配置”一章的,因爲如果需要實現更強大的功能,配置帶有反向代理功能的 Web 服務器會強大得多。

可以閱讀:


參考資料


我的博客會首發於 https://blog.walterlv.com/,而 CSDN 會從其中精選發佈,但是一旦發佈了就很少更新。

如果在博客看到有任何不懂的內容,歡迎交流。我搭建了 dotnet 職業技術學院 歡迎大家加入。

知識共享許可協議

本作品採用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。歡迎轉載、使用、重新發布,但務必保留文章署名呂毅(包含鏈接:https://walterlv.blog.csdn.net/),不得用於商業目的,基於本文修改後的作品務必以相同的許可發佈。如有任何疑問,請與我聯繫

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