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