.NET 6学习笔记(8)生成自签证书
上一篇我们通过导出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生成自签证书。
水平所限,欢迎指正。
GitHub:
manupstairs/CreateSelfSignedCert: Show how to create self signed certificate using C#. (github.com)
以下链接,是MS Learn上Windows开发的入门课程,单个课程三十分钟到60分钟不等,想要补充基础知识的同学点这里: