【ASP.NET Core】自己编程来生成自签名的服务器证书
如果项目不大,或者是客户公司内部使用,或者不想花钱购买证书,又或者用于开发阶段测试……完全可以使用自签名证书。
所谓自签,就是自己给自己签名颁发的证书,自给自足,丰衣足食。
生成证书的方法和工具很多,你可能会想到用以前 .NET Framework SDK工具,你可能想到用 OpenSSL 工具。但是,与其用工具,还不如直接调用 .NET 自身的 API ,在项目中直接创建证书来得方便。密钥随机即可,创建证书后写入到 .pfx 文件中。这样做也很方便,有利于程序搬家。
好,鬼话不多说,咱们开始今天的表演。
首先,写一个类,简单粗暴易用。
public class CerMaker
{
public static async Task CreateSslCertAsync(string subName,
DateTime bgDate,
DateTime endDate,
string outFile,
string? passWd)
{
// 参数检查
if(subName is null or { Length: < 3 })
{
throw new ArgumentNullException(nameof(subName));
}
if(endDate <= bgDate)
{
throw new ArgumentException("结束日期应大于开始日期");
}
// 随机密钥
RSA key = RSA.Create(1024);
// 创建CRT
CertificateRequest crt = new(subName, key, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
// 创建自签名证书
var cert = crt.CreateSelfSigned(bgDate, endDate);
// 将证书写入文件
byte[] data = cert.Export(X509ContentType.Pfx, passWd);
await File.WriteAllBytesAsync(outFile, data);
}
}
一个类,一个静态方法,参数 subName 表示证书的标题文本,一般使用域名,比如 CN=xpxp.org、CN=www.sb.edu.cn 等。
参数 bgDate 表示证书有效期的起始日期,一般咱们选生成证书当前时间;
参数 endDate 表示证书有效期的终止日期,即过期时间;
参数 outFile 表示 .pfx文件的保存路径,相对的绝对的都行,有写权限就行;
参数 passWd 表示给.pfx文件加密的密码,可以随便定义。
生成的过程如下:
1、RSA.Create 方法创建密钥(包含公/私钥),内容是随机生成的,1024指密钥的长度为1024位,你也可以指定为4096位;
2、创建一个 CertificateRequest 实例:
CertificateRequest crt = new(subName, key, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
第一个参数传的证书的标题,第二个参数是刚刚随机生成的密钥,第三个参数是哈希算法,此处选的是 SHA256 算法;第四个参数不用多想,就用 PKCS1 就行(这是块填充行为)。
3、调用 CreateSelfSigned 方法,就能创建证书了;
4、调用证书的 Export 方法把其导出为 .pfx 格式的数据;
5、把数据写入文件,收工。
---------------------------------------------
你看,多 Easy 的事,不用费心去找什么工具了,自己动一动手就成了。
然后,在 ASP.NET Core 项目里,咱们先检查一下证书文件存不存在,如果不存在,自动生成一个。
// 先创建自签名证书
const string CER_FILE = "host.pfx";
const string PASSWD = "dagongji";
const string SUB_NAME = "CN=万年坑玩具厂.com.cn";
DateTime today = DateTime.Now;
DateTime endday = today.AddDays(365);
if(!File.Exists(CER_FILE))
{
await CerMaker.CreateSslCertAsync(SUB_NAME, today, endday, CER_FILE, PASSWD);
}
一般来说,项目的证书并不需要换来换去,所以,咱们可以把生成证书的代码写到一个控制台应用项目中,生成一个命令行工具,自己留着用,只需要执行它生成证书文件,再放到 ASP.NET Core 项目的目录下就可以了。
在 build 应用程序之前,配置一下 Kestrel 服务器,使用咱们自己生成的证书文件。
var builder = WebApplication.CreateBuilder(args);
// 配置证书
builder.WebHost.ConfigureKestrel(opt =>
{
opt.ConfigureHttpsDefaults(cnncop =>
{
cnncop.ServerCertificate = new X509Certificate2(CER_FILE, PASSWD);
});
});
var app = builder.Build();
这是用于独立启动的 ASP.NET Core 应用程序(使用内置的 Kestrel 服务器)。如果你用的 IIS,那么证书是在IIS管理器中配置;如果你用的是 nginx,也是在服务器的配置文件中配置证书,而不是在 ASP.NET Core 代码中。
由于证书是自己签给自己的,不是从权威机构买的,所以,当浏览器访问时,会有不安全提示。只要你确认是你自己的证书,或者客户知道这是他们自家可用的证书就可以了。浏览器肯定不认识自签证书的。


好了,今天这个好用的技巧就分享到这儿了。
【ASP.NET Core】自己编程来生成自签名的服务器证书的更多相关文章
- 学习ASP.NET Core Razor 编程系列二——添加一个实体
在Razor页面应用程序中添加一个实体 在本篇文章中,学习添加用于管理数据库中的书籍的实体类.通过实体框架(EF Core)使用这些类来处理数据库.EF Core是一个对象关系映射(ORM)框架,它简 ...
- 学习ASP.NET Core Razor 编程系列五——Asp.Net Core Razor新建模板页面
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列六——数据库初始化
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列七——修改列表页面
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列十——添加新字段
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列十八——并发解决方案
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列十六——排序
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列十四——文件上传功能(二)
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列十三——文件上传功能(一)
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
随机推荐
- badusb
badusb介绍 BadUSB是利用伪造HID设备执行攻击载荷的一种攻击方式.HID(Human InterfaceDevice)设备通常指的就是键盘鼠标等与人交互的设备,用户插入BadUSB,就会 ...
- STM32控制永磁同步电机 | FOC电机控制算法概述
1. FOC基本概念 参考:https://www.sohu.com/a/432103720_120929980 FOC(field-oriented control)为磁场导向控制,又称为矢量控制( ...
- [bzoj1791][ioi2008]Island 岛屿(基环树、树的直径)
[bzoj1791][ioi2008]Island 岛屿(基环树.树的直径) bzoj luogu 题意可能会很绕 一句话:基环树的直径. 求直径: 对于环上每一个点记录其向它的子树最长路径为$dp_ ...
- Kafka学习(二)
作者:程序员cxuan链接:https://www.zhihu.com/question/53331259/answer/1262483551来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非 ...
- Vue中data数据,使用v-model属性绑定第三方插件(例如Jquery的日期插件)无法自动更新
问题原因就是html结合Vue使用,但是项目又使用了第三方日期控件,这会导致日期值选择形式的更新后,而Vue管理的对应v-model字段并未自动更新,这是因为日期控件未触发Input事件,需要我们在值 ...
- int 和 Integer 有什么区别?
Java 是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本 数据类型,但是为了能够将这些基本数据类型当成对象操作,Java 为每一个基本 数据类型都引入了对应的包装类型(wrappe ...
- java-設計模式-單例模式
單例模式 一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点. 一个类只有一个实例,且该类能自行创建这个实例的一种模式. 簡單的對比就是: 例如,Windows 中 ...
- 什么是切点JoinPoint?
程序运行中的一些时间点, 例如一个方法的执行, 或者是一个异常的处理. 在 Spring AOP 中, join point 总是方法的执行点.
- ArrayList、LinkedList、Vector、Array
ArrayList 本质是一个数组. 优势:追加元素到数组末尾的时候速度快,同时检索元素的速度也快. 劣势:如果要插入一个元素到数组之间慢:如果要追加的元素数量多于数组的容量,则需要频繁扩容使用Arr ...
- IT架构和架构类型
What is IT Architecture & Types of Architectures | ITARCH.INFO What is IT Architecture & Typ ...