.NET 6學習筆記(8)生成自簽證書

樓上那個蜀黍發表於2023-05-07

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

 

相關文章