上一篇我們透過匯出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類生成自簽證書。水平所限,歡迎指正。