0

【ASP.NET Core】自己编程来生成自签名的服务器证书 - 东邪独孤

 1 year ago
source link: https://www.cnblogs.com/tcjiaan/p/16170870.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

【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管理器中配置(IIS管理器有生成自签名证书的功能);如果你用的是 nginx,也是在服务器的配置文件中配置证书,而不是在 ASP.NET Core 代码中。

由于证书是自己签给自己的,不是从权威机构买的,所以,当浏览器访问时,会有不安全提示。只要你确认是你自己的证书,或者客户知道这是他们自家可用的证书就可以了。浏览器肯定不认识自签证书的。

367389-20220420173119080-1507189083.png
367389-20220420173217402-1959319339.png

好了,今天这个好用的技巧就分享到这儿了。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK