当前位置: 首页 > news >正文

使用 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
    • 配置 https
    • 更多配置
    • 使用更强大的方法配置 https

配置 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 证书:

  • 使用 freessl.org 为你的域名申请免费的 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 服务器会强大得多。

可以阅读:

  • 三种方法为 ASP.NET Core 对外服务添加 https 支持(kestrel / frp / nginx)
  • 使用 Frp 为你的 Web 服务添加 https 支持
  • 使用 Nginx 为你的 Web 服务添加 https 支持

参考资料

  • ASP.NET Core 中的 Kestrel Web 服务器实现 - Microsoft Docs

我的博客会首发于 https://blog.walterlv.com/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

知识共享许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://walterlv.blog.csdn.net/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

相关文章:

  • 三种方法为 ASP.NET Core 对外服务添加 https 支持(kestrel / frp / nginx)
  • 为 ASP.NET Core 程序制作 URL 的 301/302 跳转
  • 使用 Frp 为你的 Web 服务添加 https 支持
  • 全民 https!使用 FreeSSL 申请免费的 https 证书
  • 如何设置 ASP.NET Core 程序监听的 IP 和端口
  • 收集的 Linux VPS 在线重装系统脚本
  • Linux 系统根目录下的文件夹
  • 修复 Windows 10 设置界面里面混乱的语言翻译
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • 用命令行执行 .NET 单元测试时,如何仅执行符合某些条件的单元测试
  • WPF 中如何绑定附加属性?XAML 中记得加括号,C# 中记得不能用字符串
  • VSCode:当匹配到结果时,如何一次性全部选中操作(复制 删除)?
  • Unity3D 入门:安装 Unity3D 并配置与 Visual Studio 的协作开发环境
  • 在 Visual Studio 2019 (16.5) 中查看托管线程正在等待的锁被哪个线程占用
  • 将 Windows Terminal 作为外部工具集成到其他工具 程序 代码中
  • emacs初体验
  • ES2017异步函数现已正式可用
  • If…else
  • Javascript编码规范
  • Javascript基础之Array数组API
  • JavaScript异步流程控制的前世今生
  • opencv python Meanshift 和 Camshift
  • 搭建gitbook 和 访问权限认证
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 利用jquery编写加法运算验证码
  • 前端攻城师
  • 区块链技术特点之去中心化特性
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • (C语言)二分查找 超详细
  • (SpringBoot)第七章:SpringBoot日志文件
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)为C# Windows服务添加安装程序
  • .gitignore文件_Git:.gitignore
  • .Net MVC4 上传大文件,并保存表单
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .NET 表达式计算:Expression Evaluator
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .NET处理HTTP请求
  • .NET和.COM和.CN域名区别
  • .NET学习教程二——.net基础定义+VS常用设置
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解
  • []Telit UC864E 拨号上网
  • [2021]Zookeeper getAcl命令未授权访问漏洞概述与解决
  • [AutoSar]BSW_Com02 PDU详解