【ASP.NET Core】自己編程來生成自簽名的服務器證書

如果項目不大,或者是客戶公司內部使用,或者不想花錢購買證書,又或者用於開發階段測試……完全可以使用自簽名證書。

所謂自簽,就是自己給自己簽名頒發的證書,自給自足,豐衣足食。

生成證書的方法和工具很多,你可能會想到用以前 .NET Framework SDK工具,你可能想到用 OpenSSL 工具。但是,與其用工具,還不如直接調用 .NET 自身的 API ,在項目中直接創建證書來得方便。密鑰隨機即可,創建證書後寫入到 .pfx 文件中。這樣做也很方便,有利於程序搬家。

好,鬼話不多說,咱們開始今天的表演。

首先,寫一個類,簡單粗暴易用。

    public class CerMaker
    {
        public static async Task CreateSslCertAsync(string subName,
                                       DateTime bgDate,
                                       DateTime endDate,
                                       string outFile,
                                       string? passWd)
        {
            // 參數檢查
            if(subName is null or { Length: < 3 })
            {
                throw new ArgumentNullException(nameof(subName));
            }
            if(endDate <= bgDate)
            {
                throw new ArgumentException("結束日期應大於開始日期");
            }
            // 隨機密鑰
            RSA key = RSA.Create(1024);
            // 創建CRT
            CertificateRequest crt = new(subName, key, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
            // 創建自簽名證書
            var cert = crt.CreateSelfSigned(bgDate, endDate);
            // 將證書寫入文件
            byte[] data = cert.Export(X509ContentType.Pfx, passWd);
            await File.WriteAllBytesAsync(outFile, data);
        }
    }

 

一個類,一個靜態方法,參數 subName 表示證書的標題文本,一般使用域名,比如 CN=xpxp.org、CN=www.sb.edu.cn 等。

參數 bgDate 表示證書有效期的起始日期,一般咱們選生成證書當前時間;

參數 endDate 表示證書有效期的終止日期,即過期時間;

參數 outFile 表示 .pfx文件的保存路徑,相對的絕對的都行,有寫權限就行;

參數 passWd 表示給.pfx文件加密的密碼,可以隨便定義。

 

生成的過程如下:

1、RSA.Create 方法創建密鑰(包含公/私鑰),內容是隨機生成的,1024指密鑰的長度為1024位,你也可以指定為4096位;

2、創建一個 CertificateRequest 實例:

  CertificateRequest crt = new(subName, key, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);

第一個參數傳的證書的標題,第二個參數是剛剛隨機生成的密鑰,第三個參數是哈希算法,此處選的是 SHA256 算法;第四個參數不用多想,就用 PKCS1 就行(這是塊填充行為)。

3、調用 CreateSelfSigned 方法,就能創建證書了;

4、調用證書的 Export 方法把其導出為 .pfx 格式的數據;

5、把數據寫入文件,收工。

———————————————

你看,多 Easy 的事,不用費心去找什麼工具了,自己動一動手就成了。

 

然後,在 ASP.NET Core 項目里,咱們先檢查一下證書文件存不存在,如果不存在,自動生成一個。

// 先創建自簽名證書
const string CER_FILE = "host.pfx";
const string PASSWD = "dagongji";
const string SUB_NAME = "CN=萬年坑玩具廠.com.cn";
DateTime today = DateTime.Now;
DateTime endday = today.AddDays(365);
if(!File.Exists(CER_FILE))
{
    await CerMaker.CreateSslCertAsync(SUB_NAME, today, endday, CER_FILE, PASSWD);
}

 

一般來說,項目的證書並不需要換來換去,所以,咱們可以把生成證書的代碼寫到一個控制台應用項目中,生成一個命令行工具,自己留着用,只需要執行它生成證書文件,再放到 ASP.NET Core 項目的目錄下就可以了。

 

在 build 應用程序之前,配置一下 Kestrel 服務器,使用咱們自己生成的證書文件。

var builder = WebApplication.CreateBuilder(args);
// 配置證書
builder.WebHost.ConfigureKestrel(opt =>
{
    opt.ConfigureHttpsDefaults(cnncop =>
    {
        cnncop.ServerCertificate = new X509Certificate2(CER_FILE, PASSWD);
    });
});
var app = builder.Build();

這是用於獨立啟動的 ASP.NET Core 應用程序(使用內置的 Kestrel 服務器)。如果你用的 IIS,那麼證書是在IIS管理器中配置;如果你用的是 nginx,也是在服務器的配置文件中配置證書,而不是在 ASP.NET Core 代碼中。

 

由於證書是自己簽給自己的,不是從權威機構買的,所以,當瀏覽器訪問時,會有不安全提示。只要你確認是你自己的證書,或者客戶知道這是他們自家可用的證書就可以了。瀏覽器肯定不認識自簽證書的。

 

 

 

 

好了,今天這個好用的技巧就分享到這兒了。