.NET 部署Https(SSL)通过代码方式
在上一个文章中,传送门,给大家介绍了怎么在配置文件中使用 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
andHttps
是等效的。 - 每个终结点都要具备
Url
参数。 此参数的格式和顶层Urls
配置参数一样,只不过它只能有单个值。 - 这些终结点不会添加进顶层
Urls
配置中定义的终结点,而是替换它们。 通过Listen
在代码中定义的终结点与在配置节中定义的终结点相累积。 Certificate
部分是可选的。 如果未指定Certificate
部分,则使用Certificates:Default
中定义的默认值。 如果没有可用的默认值,则使用开发证书。 如果没有默认值,且开发证书不存在,则服务器将引发异常,并且无法启动。Certificate
部分支持多个证书源。- 只要不会导致端口冲突,就能在配置中定义任何数量的终结点。
证书源
可以将证书节点配置为从多个源加载证书:
Path
和Password
用于加载 .pfx 文件。Path
、KeyPath
和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 进去看更为直接
构造函数
直接 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
最新文章
- 一种简单,轻量,灵活的C#对象转Json对象的方案(续)
- 在chrome 总调试cordova出现Detached from the target. Remote debugging has been terminated with reason: Connection lost. Please re-attach to the new target
- 关于s:iterator 和s:if 的结合使用
- Android的两种事件处理机制
- -XX:+PrintGCDetails 打印GC详细信息
- D3.js 理解 Update、Enter、Exit
- 把CheckedListBoxControl设置为单选框
- 17.1.1.5 Creating a Data Snapshot Using mysqldump
- C#中的委托范例学习
- python基础操作_方法(函数)
- ado.net的简单数据库操作(三)——简单增删改查的实际应用
- CTF--web
- openjtag 的硬件连接踩坑历程
- EF 事物Transaction简单操作
- POJ 1066 昂贵的聘礼
- HDU 6153 扩展kmp
- .NET 正则表达式使用高级技巧之替换类介绍
- Struts2(七)基础小结
- oozie4.3.0+sqoop1.4.6实现mysql到hive的增量抽取
- erlang游戏开发tcp
热门文章
- CVPR 2017:See the Forest for the Trees: Joint Spatial and Temporal Recurrent Neural Networks for Video-based Person Re-identification
- vue2升级vue3指南(一)—— 环境准备和构建篇
- Webpack干货系列 | 在 Webpack 5 集成 ESLint 的方法
- jdbc 11: 封装自己的jdbc工具类
- Page和list的区别 mybatis
- 关于奇妙的 Fibonacci 的一些说明
- Python3.7+jieba(结巴分词)配合Wordcloud2.js来构造网站标签云(关键词集合)
- 多云部署多主模式的MGR集群,每个云一个MGR 节点,满足业务单元化改造的需求
- PureRandom采样类定义和测试
- 发布 .NET MAUI / MAUI Blazor 应用 (1) - Windows