.NET 6学习笔记(8)生成自签证书

2023-06-12,,

上一篇我们通过导出IIS Express的自签证书,供ASP.NET Core程序启用HTTPS。本篇我们讨论如何生成自签证书。
自签证书的生成,有多种方式。比如OpenSSL或PowerShell都可以通过命令生成证书。对于.NET程序,也有System.Security.Cryptography.X509Certificates命名空间下,对应的C#类来实现。
首先我们通过类X500DistinguishedName来填写证书的Subject,即使用者信息。
Subject中的信息用以识别证书使用者,对自签证书来说可能不太重要,常见的字段有:

比如该证书由中国的巨硬软件研发中心使用,Subject可能就是下面的写法。

string subject = $"C=CN, O=Hugehardsoft, OU=R&D Hub, CN={Environment.MachineName}";

var rsa = RSA.Create();
var x500DistinguishedName = new X500DistinguishedName(subject);
var req =
new CertificateRequest(x500DistinguishedName, rsa, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);

SSL证书一般通过RSA算法来生成公钥和私钥。
在创建CertificateRequest实例之后,我们需要添加DnsName,可以认为证书只对这里添加到DnsName的地址才有效。

SubjectAlternativeNameBuilder sanBuilder = new SubjectAlternativeNameBuilder();
sanBuilder.AddDnsName("localhost");
sanBuilder.AddDnsName(Environment.MachineName);
req.CertificateExtensions.Add(sanBuilder.Build());

比如上述代码,仅添加了localhost和机器名作为DnsName,那么我们在用IP地址访问时。证书将显示为不可信,网站不安全。
在完成DnsName的添加后,我们就可以生成自签证书了。通过CreateSelfSigned方法,创建一个10年有效期的证书,并将证书保存为c:\temp\SelfSignedSample.pfx文件,同时设置证书的导出密码为123456。我们通过Kestrel配置证书时将会用到该密码。

var cert = req.CreateSelfSigned(DateTimeOffset.Now, DateTimeOffset.Now.AddYears(10));
File.WriteAllBytes("C:\\temp\\SelfSignedSample.pfx", cert.Export(X509ContentType.Pfx, "123456"));

参考上一篇《.NET 6学习笔记(7)——ASP.NET Core通过配置文件启用HTTPS》,我们创建一个ASP.NET Core的Web APP。

然后在appsettings.production.json里添加Kestrel的配置项:

{
"Kestrel": {
"Endpoints": {
"Https": {
"Url": "https://localhost:8888",
"Certificate": {
"Path": "c:\\temp\\SelfSignedSample.pfx",
"Password": "123456"
}
}
}
}
}

我们在Properties文件夹下的launchSettings.json中,修改对应Kestrel托管的配置项,将"ASPNETCORE_ENVIRONMENT"修改为"Production"。

  "profiles": {
"WebAppWithSelfSignedCert": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "https://localhost:7122;http://localhost:5122",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Production"
}
},

此时我们用Kestrel托管(不是IIS Express)上述ASP.NET Core应用,并通过https://localhost:8888去访问该网站。会发现提示不是专用连接。这是因为我们没有信任该自签证书。

就和12306网站的证书一样的操作,需要安装该自签证书。实际用户可以通过浏览器导出证书。然后双击进行安装。

需要注意的是,我们应该证书安装到“受信任的根证书颁发机构”。

完成上述操作之后。清理浏览器缓存并关闭浏览器,重新打开后我们再通过localhost:8888去访问网站,就会看到显示为可信任的https连接了。
但是如果我们用本机的IP去访问,仍然会使不受信任的状态。这是因为之前提到的没有把IP地址加入到证书的DnsName中。

本篇我们介绍了如何通过.NET中命名空间System.Security.Cryptography.X509Certificates下的Class类生成自签证书。水平所限,欢迎指正。

.NET 6学习笔记(8)生成自签证书的相关教程结束。

《.NET 6学习笔记(8)生成自签证书.doc》

下载本文的Word格式文档,以方便收藏与打印。