如果项目不大,或者是客户公司内部使用,或者不想花钱购买证书,又或者用于开发阶段测试……完全可以使用自签名证书。

所谓自签,就是自己给自己签名颁发的证书,自给自足,丰衣足食。

生成证书的方法和工具很多,你可能会想到用以前 .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】自己编程来生成自签名的服务器证书的更多相关文章

  1. 学习ASP.NET Core Razor 编程系列二——添加一个实体

    在Razor页面应用程序中添加一个实体 在本篇文章中,学习添加用于管理数据库中的书籍的实体类.通过实体框架(EF Core)使用这些类来处理数据库.EF Core是一个对象关系映射(ORM)框架,它简 ...

  2. 学习ASP.NET Core Razor 编程系列五——Asp.Net Core Razor新建模板页面

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  3. 学习ASP.NET Core Razor 编程系列六——数据库初始化

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  4. 学习ASP.NET Core Razor 编程系列七——修改列表页面

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  5. 学习ASP.NET Core Razor 编程系列十——添加新字段

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  6. 学习ASP.NET Core Razor 编程系列十八——并发解决方案

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  7. 学习ASP.NET Core Razor 编程系列十六——排序

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  8. 学习ASP.NET Core Razor 编程系列十四——文件上传功能(二)

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  9. 学习ASP.NET Core Razor 编程系列十三——文件上传功能(一)

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

随机推荐

  1. K8S原来如此简单(八)ServiceAccount+RBAC

    ServiceAccount ServiceAccount是给运行在Pod的程序使用的身份认证,Pod容器的进程需要访问API Server时用的就是ServiceAccount账户. Service ...

  2. 浅谈systemd原理和应用

    多不说,直接上代码(可谓配置): [Unit] Description=demo app After=network-is-online.target [Service] Type=Simple Ex ...

  3. Ubuntu下交换Alt和Ctrl (适用于任何按键修改)

    在 Ubuntu 下交换Alt和Ctrl键: sudo vim /usr/share/X11/xkb/keycodes/evdev 或者用系统默认编辑器打开: sudo xdg-open /usr/s ...

  4. Python执行机制

    1.4 Python执行机制 Python中IDLE是其自带的集成开发工具(IDE:同时拥有编辑.编译.调试.运行等多种功能的集成工具),并且它也是Python自带的编译器和解释器. 1.4.1 Py ...

  5. Mybatis 的 Xml 映射文件中,不同的 Xml 映射文件,id 是否可以重复?

    不同的 Xml 映射文件,如果配置了 namespace,那么 id 可以重复:如果没有配 置 namespace,那么 id 不能重复: 原因就是 namespace+id 是作为 Map<S ...

  6. 深入理解Java虚拟机-HotSpot虚拟机对象探秘

    一.对象的创建过程 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初始化过.如果没有,那就先执行相应的类 ...

  7. 当一个线程进入一个对象的 synchronized 方法 A 之后, 其它线程是否可进入此对象的 synchronized 方法 B?

    不能.其它线程只能访问该对象的非同步方法,同步方法则不能进入.因为非静 态方法上的 synchronized 修饰符要求执行方法时要获得对象的锁,如果已经进入 A 方法说明对象锁已经被取走,那么试图进 ...

  8. MyBatis 实现一对一有几种方式?具体怎么操作的?

    有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次, 通过在 resultMap 里面配置 association 节点配置一对一的类就可以完成: 嵌套查询是先查一个表,根据这个表里面的结果的 ...

  9. 为什么 redis 需要把所有数据放到内存中?

    答Redis 为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数 据写入磁盘.所以 redis 具有快速和数据持久化的特征.如果不将数据放在内存中, 磁盘 I/O 速度为严重影响 redi ...

  10. pygame.error: video system not initialized

    在pygame写游戏出现pygame.error: video system not initialized 源代码 import sysimport pygamedef run_game(): py ...