.NetCore+OpenSSL實現Https

跳躍的鍵盤手發表於2021-08-16

前言

最近,有時間研究了一下HTTPS安全通訊的原理,感興趣的同學可以看下上一篇博文深入理解Https如何保證通訊安全 ,隨即聯想到近段時間開發的.NetCore專案,.NetCore API應用程式是預設支援HTTP(5000埠)和HTTPS(5001埠)的,但由於專案都是在內網中使用,所以走的都是HTTP,忽略了HTTPS的實戰應用,所以本著“厚積薄發”的原則,和大家分享下實操經驗。

OpenSSL自簽名證書

HTTPS安全通訊需要“數字證書”,.NetCore中支援X.509格式標準的安全證書,所以我們先要搞一個X509自簽名證書(正規的網站需要向CA機構申請證書),這裡推薦大家用OpenSSL工具生成證書。

Windows版本下載地址: http://slproweb.com/products/Win32OpenSSL.html ,如果只是自測使用,下載簡化版Light的exe格式的直接安裝就行。

CMD視窗啟動OpenSSL:

 第一步:生成私鑰檔案.key

genrsa -out test.key 2048

2048:表示私鑰檔案位元組大小

第二步:生成cer格式證書(適用windows系統)

req -new -x509 -key test.key -out test.cer -days 3650

-509:表示生成x509證書而不是生成證書請求檔案csr

-key:指定私鑰檔案,與生成的cer(實際就是包含公鑰)形成金鑰對

-days 3650:設定證書有效期,以天為單位

後續會要求輸入證書的相關資訊:

 其中Common Name一定要注意:要設定你的網站的域名(如果是本地環境,可以自定義一個域名,修改系統Host檔案,將127.0.0.1指向自定義域名,如:www.samples.com)

第三步:生成.pfx證書(包含私鑰和公鑰),.NetCore專案中使用

pkcs12 -export -out test.pfx -inkey test.key -in test.cer

然後按照提示設定證書密碼:

完成以上步驟後,我們就可以在根目錄得到三份檔案

 然後,你只要在本地安裝.cer證書就可以安全訪問自簽名的HTTPS網站了。

.NetCore API專案開啟HTTPS

為Kestrel伺服器開啟Https埠監聽,並使用X509格式證書驗證。

public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(builder =>
            {
                builder.UseKestrel(options =>
                {
                    //設定監聽埠
                    var configure = options.ApplicationServices.GetRequiredService<IConfiguration>();
                    var port = configure.GetValue<int>("Http:Port");
                    options.ListenAnyIP(port);
                    //監聽https埠
                    var httpsPort = configure.GetValue<int>("Https:Port");
                    options.ListenAnyIP(httpsPort, config =>
                    {
                        var certPath = configure.GetValue<string>("Cert:path");
                        var certPwd = configure.GetValue<string>("Cert:pwd");
                        var x509ca = new X509Certificate2(certPath, certPwd);
                        //config.UseHttps(certPath, certPwd);
                        config.UseHttps(x509ca);
                    });
                });
                builder.UseStartup<Startup>();
            });

證書路徑和證書密碼我這裡是通過配置檔案配置的,證書密碼就是上面我們生成.pfx檔案時輸入的Export PassWord。

開啟IE瀏覽器訪問https,正常訪問且鎖標誌安全顯示

 至此,自簽名證書已實現HTTPS安全通訊。

但是奇怪的問題來了,Chrome瀏覽器卻依舊不支援,Chrome開啟後提示沒有指定主題名稱:

 關於這個問題我也是在網上找了幾個版本的解決方案,大多數都是說修改openssl配置檔案openssl.cnf,且多是在Linux環境下的操作,對於我們這個windows簡化版本的OpenSSL來說確定無效。

於是根據網上的一些其他思路,自己摸索出了下面的方式:

第一步:同樣生成私鑰檔案.key

genrsa -out test1.key 2048

第二步:生成csr證書籤名請求檔案

該檔案實際是用來向CA機構申請證書的,由於我們是自簽名,所以接下來我們用這個檔案生成.cer證書

req -new -key test1.key -out test1.csr
csr檔案要求輸入以下證書資訊:

 同樣,這裡需要注意Common Name域名配置

第三步:生成.Cer證書

x509 -req -days 365 -in test1.csr -signkey test1.key -out test1.cer -extfile http.ext

這裡注意: -extfile http.ext ,根目錄下新增http.ext檔案,並填寫以下內容:

keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth, clientAuth
subjectAltName=@SubjectAlternativeName
[ SubjectAlternativeName ]
DNS.1=www.samples.com

 DNS.1=www.samples.com 這裡實際上就是指定主題備用名稱,和證書檔案中的Common Name域名保持一致。

完了之後,我們可以看下證書資訊:

x509  -in test1.cer -text -noout

我們發現http.ext檔案中的資訊已成功加入證書資訊中。

第四步:同樣,生成.pfx證書(包含私鑰和公鑰)

pkcs12 -export -out test1.pfx -inkey test1.key -in test1.cer

然後開啟Chrome瀏覽器,訪問正常且安全

 本文向大家介紹了windows環境下使用OpenSSL生成自簽名證書的操作步驟,模擬了HTTPS的數字證書,以及解決Chrome瀏覽器證書不可信問題的解決方案,並結合.NetCore專案實現了HTTPS安全通訊。

相關文章