在上一个文章中,传送门,给大家介绍了怎么在配置文件中使用 Kestrel 部署 Https,正好今天有小伙伴稳问到:可以通过代码的方式实现 Kestrel 的 Https 的部署吗?答案是肯定的,我们这次一样去不是多个域名。

  在使用代码实现中,我是主要使用到 ListenOptions.UseHttps,我们先看看官方文档怎么说吧,不想看我的可以直接跳转到官方文档,传送门


ListenOptions.UseHttps

将 Kestrel 配置为使用 HTTPS。

ListenOptions.UseHttps 扩展:

  • UseHttps:将 Kestrel 配置为使用 HTTPS,采用默认证书。 如果没有配置默认证书,则会引发异常。
  • UseHttps(string fileName)
  • UseHttps(string fileName, string password)
  • UseHttps(string fileName, string password, Action<HttpsConnectionAdapterOptions> configureOptions)
  • UseHttps(StoreName storeName, string subject)
  • UseHttps(StoreName storeName, string subject, bool allowInvalid)
  • UseHttps(StoreName storeName, string subject, bool allowInvalid, StoreLocation location)
  • UseHttps(StoreName storeName, string subject, bool allowInvalid, StoreLocation location, Action<HttpsConnectionAdapterOptions> configureOptions)
  • UseHttps(X509Certificate2 serverCertificate)
  • UseHttps(X509Certificate2 serverCertificate, Action<HttpsConnectionAdapterOptions> configureOptions)
  • UseHttps(Action<HttpsConnectionAdapterOptions> configureOptions)

ListenOptions.UseHttps 参数:

  • filename 是证书文件的路径和文件名,关联包含应用内容文件的目录。
  • password 是访问 X.509 证书数据所需的密码。
  • configureOptions 是配置 HttpsConnectionAdapterOptions 的 Action。 返回 ListenOptions
  • storeName 是从中加载证书的证书存储。
  • subject 是证书的主题名称。
  • allowInvalid 指示是否存在需要留意的无效证书,例如自签名证书。
  • location 是从中加载证书的存储位置。
  • serverCertificate 是 X.509 证书。

在生产中,必须显式配置 HTTPS。 至少必须提供默认证书。

下面要描述的支持的配置:

  • 无配置
  • 从配置中替换默认证书
  • 更改代码中的默认值

无配置

Kestrel 在 http://localhost:5000 和 https://localhost:5001 上进行侦听(如果默认证书可用)。

从配置中替换默认证书

Kestrel 可以使用默认 HTTPS 应用设置配置架构。 从磁盘上的文件或从证书存储中配置多个终结点,包括要使用的 URL 和证书。

架构的注意事项:

  • 终结点的名称不区分大小写。 例如,由于再也无法解析标识符“Families”,因此 HTTPS and Https 是等效的。
  • 每个终结点都要具备 Url 参数。 此参数的格式和顶层 Urls 配置参数一样,只不过它只能有单个值。
  • 这些终结点不会添加进顶层 Urls 配置中定义的终结点,而是替换它们。 通过 Listen 在代码中定义的终结点与在配置节中定义的终结点相累积。
  • Certificate 部分是可选的。 如果未指定 Certificate 部分,则使用 Certificates:Default 中定义的默认值。 如果没有可用的默认值,则使用开发证书。 如果没有默认值,且开发证书不存在,则服务器将引发异常,并且无法启动。
  • Certificate 部分支持多个证书源
  • 只要不会导致端口冲突,就能在配置中定义任何数量的终结点。

证书源

可以将证书节点配置为从多个源加载证书:

  • Path 和 Password 用于加载 .pfx 文件。
  • PathKeyPath 和 Password 用于加载 .pem/.crt 和 .key 文件。
  • Subject 和 Store 用于从证书存储中加载。

好了,罗嗦话说完了,我们抽取文档的一部分进行实践

var builder = WebApplication.CreateBuilder(args);

builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.ListenAnyIP(5005, listenOptions =>
{
listenOptions.UseHttps(httpsOptions =>
{
var localhostCert = CertificateLoader.LoadFromStoreCert(
"localhost", "My", StoreLocation.CurrentUser,
allowInvalid: true);
var exampleCert = CertificateLoader.LoadFromStoreCert(
"example.com", "My", StoreLocation.CurrentUser,
allowInvalid: true);
var subExampleCert = CertificateLoader.LoadFromStoreCert(
"sub.example.com", "My", StoreLocation.CurrentUser,
allowInvalid: true);
var certs = new Dictionary<string, X509Certificate2>(
StringComparer.OrdinalIgnoreCase)
{
["localhost"] = localhostCert,
["example.com"] = exampleCert,
["sub.example.com"] = subExampleCert
}; httpsOptions.ServerCertificateSelector = (connectionContext, name) =>
{
if (name is not null && certs.TryGetValue(name, out var cert))
{
return cert;
} return exampleCert;
};
});
});
});

  上面的代码一看就能懂,比较无奈的是官方文档的 SSL 证书是从 证书存储区 里获取的,在实际应用中,明显是不够方便,最好是那种直接写 证书路径 和 密码的,这样才能一目了然嘛,而这里的关键就是 X509Certificate2 这个类了,可以看到,最终是通过检索一个字典返回的,接受的就是这个 X509Certificate2 类,所以我们看看这个类到底是个什么东西,传送门

  这里我们只关注构造函数,下面是官方文档,或者直接 F12 进去看更为直接


构造函数

X509Certificate2()
已过时。

初始化 X509Certificate2 类的新实例。

X509Certificate2(Byte[])

使用来自字节数组的信息初始化 X509Certificate2 类的新实例。

X509Certificate2(Byte[], SecureString)

使用一个字节数组和一个密码初始化 X509Certificate2 类的新实例。

X509Certificate2(Byte[], SecureString, X509KeyStorageFlags)

使用一个字节数组、一个密码和一个密钥存储标志初始化 X509Certificate2 类的新实例。

X509Certificate2(Byte[], String)

使用一个字节数组和一个密码初始化 X509Certificate2 类的新实例。

X509Certificate2(Byte[], String, X509KeyStorageFlags)

使用一个字节数组、一个密码和一个密钥存储标志初始化 X509Certificate2 类的新实例。

X509Certificate2(IntPtr)

使用非托管句柄初始化 X509Certificate2 类的新实例。

X509Certificate2(ReadOnlySpan<Byte>)

用证书数据初始化 X509Certificate2 类的新实例。

X509Certificate2(ReadOnlySpan<Byte>, ReadOnlySpan<Char>, X509KeyStorageFlags)

使用证书数据、密码和密钥存储标志初始化 X509Certificate2 类的新实例。

X509Certificate2(SerializationInfo, StreamingContext)

使用指定的序列化和流上下文信息初始化 X509Certificate2 类的新实例。

X509Certificate2(String)

使用证书文件名初始化 X509Certificate2 类的新实例。

X509Certificate2(String, ReadOnlySpan<Char>, X509KeyStorageFlags)

使用一个证书文件名、一个密码和一个密钥存储标志初始化 X509Certificate2 类的新实例。

X509Certificate2(String, SecureString)

使用一个证书文件名和一个密码初始化 X509Certificate2 类的新实例。

X509Certificate2(String, SecureString, X509KeyStorageFlags)

使用一个证书文件名、一个密码和一个密钥存储标志初始化 X509Certificate2 类的新实例。

X509Certificate2(String, String)

使用一个证书文件名和一个用于访问该证书的密码初始化 X509Certificate2 类的新实例。

X509Certificate2(String, String, X509KeyStorageFlags)

使用一个证书文件名、一个用于访问该证书的密码和一个密钥存储标志初始化 X509Certificate2 类的新实例。

X509Certificate2(X509Certificate)

使用 X509Certificate 对象初始化 X509Certificate2 类的新实例。

 

  直接 F12 也贴出来吧,方便大伙查看

  帅气的小伙伴可能已经发现了,里面就存在了一个 直接传入 文件路径 和 密码 作为参数的构造函数,毫无疑问,它就是我们要找的!!!下面我们直接看代码:

Program.cs

builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
listenOptions.SslProtocols = SslProtocols.Tls13;
});
serverOptions.ListenAnyIP(5209, listenOptions =>
{
listenOptions.UseHttps(httpsOptions =>
{
var test1 = new X509Certificate2("cer\\test1.ysmc.net.cn_server.pfx", "密码1");
var test2 = new X509Certificate2("cer\\test2.ysmc.net.cn_server.pfx", "密码2");
var certs = new Dictionary<string, X509Certificate2>(
StringComparer.OrdinalIgnoreCase)
{
["test1.ysmc.net.cn"] = test1,
["test2.ysmc.net.cn"] = test2
}; httpsOptions.ServerCertificateSelector = (connectionContext, name) =>
{
if (name is not null && certs.TryGetValue(name, out var cert))
{
return cert;
} return test1;
};
});
});
});

  因为是配合了 YARP 食用的,详情可以查看我前面的文章,传送门,所以不同的域名会反向代理到不同的网站上面,好了,文章到此结束,感谢大佬们的阅读,谢谢!

原文链接:https://www.cnblogs.com/ysmc/p/16721268.html

.NET 部署Https(SSL)通过代码方式的更多相关文章

  1. 从新浪微博和MySQL的password保护机制谈HTTPS/SSL的必要性

    尽管业界已经达成共识,在传输用户password等须要保密的信息时,尽可能採用HTTPS/SSL协议传输. 但我们还是能够看到少数没实用HTTPS/SSL加密的站点或应用. 新浪微博的登录页面和MyS ...

  2. 有了SSL证书,如何在IIS环境下部署https?【转载】

    昨天各位小伙伴都很开心的领取了自己的SSL证书,但是大部分小伙伴却不知道如何部署,也许是因为第一次接触SSL这种高端的东西吧,不过个人觉得就是懒懒懒...本来小编也挺懒的,但是答应了各位小伙伴的,那么 ...

  3. NET Core Kestrel部署HTTPS使用SSL证书

    ASP.NET Core配置 Kestrel部署HTTPS.现在大部分网站已经部署HTTPS,大家对于安全越来越重视. 今天简单介绍一下ASP.NET Core 部署HTTPS,直接通过配置Kestr ...

  4. 我们在部署 HTTPS 网站时,该如何选择SSL证书?

    我们在部署 HTTPS 网站时,该如何选择SSL证书? 首次部署HTTPS网站的同学对选择什么样的SSL证书多多少少都有点迷茫. 这里考虑的因素确实不少:是否支持多域名.泛域名,价格,信息泄露的保额, ...

  5. 有了SSL证书,如何在IIS环境下部署https?

    昨天各位小伙伴都很开心的领取了自己的SSL证书,但是大部分小伙伴却不知道如何部署,也许是因为第一次接触SSL这种高端的东西吧,不过个人觉得就是懒懒懒...本来小编也挺懒的,但是答应了各位小伙伴的,那么 ...

  6. Nginx+Tomcat Https SSL部署方案

    1.软件版本: nginx-1.15+ tomcat-8.0+ 2.先解决一个疑问:Tomcat到底需不需要配置SSL? 答案:不需要 3.SSL申请 使用腾讯云.阿里云的服务器,会更加方便申请.(申 ...

  7. nginx开启ssl并把http重定向到https的两种方式

    1 简介 Nginx是一个非常强大和流行的高性能Web服务器.本文讲解Nginx如何整合https并将http重定向到https. https相关文章如下: (1)Springboot整合https原 ...

  8. 明年将制定个人信息保护法 网站部署https迫在眉睫

    12月20日,全国人大常委会法工委举行第三次记者会.全国人大常委会法工委发言人岳仲明表示,中国明年将制定个人信息保护法.数据安全法等. 数据泄露为何频频出现 你是否经常接到骚扰电话?推销.诈骗等等均有 ...

  9. 一次部署HTTPS的相关事件引发的思考

    前言: 上周五快要下班的时候,突然收到通知客户希望了解一下部署HTTPS的流程,这种事情谁听了都会有几分诧异的.因为这件事虽然和工作有一定的相关度,但平时不会走这个方向,实际上也较少接触.此外,客户手 ...

随机推荐

  1. scrapy框架入门

    scrapy迄今为止依然是世界上最好用,最稳定的爬虫框架,相比于其他直接由函数定义的程序, scrapy使用了面向对象并对网页请求的过程分成了很多个模块和阶段,实现跨模块和包的使用,大大提升了代码的稳 ...

  2. 【有用的SQL】查Greenplum的数据字典

    Greenplum 查询哪个表的分布键 ( Greenplum ) SELECT att.nspname AS 模式名 , att.relname AS 表名 , table_comment AS 表 ...

  3. ooday08 Java_多态_向下强制转型

    笔记: 多态: 表现: 同一个对象被造型为不同的类型时,有不同的功能 --对象的多态:我.你.水......------所有对象都是多态的(明天体会) 同一类型的引用指向不同的对象时,有不同的实现 - ...

  4. 在 IDEA 里下个五子棋不过分吧?

    大家好,我是二哥呀!今天给大家分享一个基于Netty的IDEA即时聊天插件,可以实现即时聊天.游戏对战(下棋). GitHub 地址:https://github.com/anlingyi/xecha ...

  5. 推荐系统-协同过滤在Spark中的实现

    作者:vivo 互联网服务器团队-Tang Shutao 现如今推荐无处不在,例如抖音.淘宝.京东App均能见到推荐系统的身影,其背后涉及许多的技术.本文以经典的协同过滤为切入点,重点介绍了被工业界广 ...

  6. EPLAN 中的符号、元件、部件与设备之间的区别

    符号(Symbol):电气符号是电器设备(Electrical equipment)的一种图形表达,符号存放在符号库中,是广大电气工程师之间的交流语言,用来传递系统控制的设计思维的.将设计思维体现出来 ...

  7. 程序员的专属浪漫——用3D Engine 5分钟实现烟花绽放效果

    谁说程序员不懂浪漫? 作为程序员,用自己的代码本事手搓一个技术感十足的惊喜,我觉得,这是不亚于车马慢时代手写信的古典主义浪漫. 那么,应该怎样创作出具有自我身份属性的浪漫惊喜呢? 玩法很多,今天给大家 ...

  8. 倒计时2日!基于 Apache DolphinScheduler&TiDB 的交叉开发实践,从编写到调度让你大幅提升效率

    当大数据挖掘成为企业赖以生存.发展乃至转型的生命,如何找到一款好软件帮助企业满足需求,成为了许多大数据工程师困扰的问题.但在当下高速发展的大数据领域,光是一款好软件似乎都不足以满足所有场景业务需求,许 ...

  9. LuoguU72177 火星人plus (逆康拓展开)

    没开long long见祖宗... BIT先求逆序对来造表存展开关系,线段树维护01进制 #include <iostream> #include <cstdio> #incl ...

  10. React报错之Expected `onClick` listener to be a function

    正文从这开始~ 总览 当我们为元素的onClick属性传递一个值,但是该值却不是函数时,会产生"Expected onClick listener to be a function" ...