松原網主頁 > 科技 > 正文 >

ASP.NET Core和Https!

2020-11-20 12:24:37 來源:互聯網 閱讀:-
【摘要】worker_processes4;events { worker_connections 1024; }http { sendfile on; upstream receiver_server { server receiver:80; } server { listen 80
ASP.NET Core和Https

合格的web后端程序員,除搬磚技能,還必須會給各種web服務器啟用Https,本文結合ASP.NET Core部署模型聊一聊啟用Https的方式。

溫故知新

目前常見的Http請求明文傳輸,請求可能被篡改,訪問的站點可能被偽造。

HTTPS是HTTP加上TLS/SSL協議構建的可進行加密傳輸、身份認證的網絡協議,主要通過數字證書、加密算法、非對稱密鑰等技術完成互聯網數據傳輸加密,實現互聯網傳輸安全保護。

ASP.NET Core和Https

流程解讀

① 傳輸密鑰是對稱密鑰,用于雙方對傳輸數據的加解密

② 怎么在傳輸之前確立傳輸密鑰呢?

答:針對普遍的多客戶端訪問受信web服務器的場景, 提出非對稱密鑰(公鑰下發給客戶端,私鑰存于web服務器),雙方能互相加解密,說明中間數據(傳輸密鑰)沒被篡改。

③ 再拋出疑問,客戶端如何認定下發的公鑰是目標web服務器的公鑰?又如何確定公鑰下發過程沒被截取篡改?

答:追溯到握手階段的證書驗證過程,瀏覽器從證書提?。ㄗC書頒發機構,證書綁定的域名,證書簽名,證書有效期);瀏覽器先驗證證書綁定的域名是否與目標域名匹配;瀏覽器內置證書頒發機構認定該證書是其有效下發;通過簽名認定該證書沒被篡改

④ 所以瀏覽器內置的證書機構(根證書)的權威性很重要, 中毒或山寨瀏覽器可能攜帶非法的根證書。

如果面向面試記憶Https原理,恐怕有些難度,所以個人用一種 【雞生蛋還是蛋生雞】的方式向上追溯流程, 方便大家知其然更知其所以然。

下面演示對ASP.NET Core程序兩種常見部署模型強制應用Https。

常規反向代理模型

ASP.NET Core和Https

由nginx反向代理請求到后端https://receiver.server, 在nginx上添加HTTPS證書, 并強制使用HTTPS。

worker_processes 4;events { worker_connections 1024; }http { sendfile on; upstream receiver_server { server receiver:80; } server { listen 80; listen [::]:80; server_name eqid.******.com; return 301 https://eqid.******.com$request_uri; }
server { listen 443 ssl; listen [::]:443 ssl; ssl on; server_name eqid.******.com;
ssl_certificate /conf.crt/live/******.com.crt; ssl_certificate_key /conf.crt/live/******.com.key; location / { proxy_pass http://receiver_server; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_redirect off; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }}

dotnet.exe自宿模型

Kestrel用作邊緣(面向Internet)Web服務器, 這個部署模型不常見,但依舊存在。

ASP.NET Core和Https

我們利用 Visual Studio 2019項目模板構建 ASP.NetCore項目--- 勾選HTTPS支持, 會默認添加支持Https的Middleware;

  • app.UseHttpsRedirection 強制Http請求跳轉到Https

  • app.UseHsts 指示瀏覽器為特定主機頭在特定時間范圍內的所有通信應用Https。

HSTS(HTTP Strict Transport Protocol)的作用是強制瀏覽器使用HTTPS與服務器創建連接,避免原有的301重定向Https時可能發生中間人劫持。

服務器開啟HSTS的方法是,當客戶端通過HTTPS發出請求時,在服務器返回的超文本傳輸協議響應頭中包含Strict-Transport-Security字段。非加密傳輸時設置的HSTS字段無效。

Development證書

VS模板構建的web會使用dotnet cli 提供的開發證書在https://localhost:5001 地址接收請求。

關于開發證書, 可倒騰 dotnet dev-certs https --help 命令:

dotnet dev-certs https -c清除證書,啟動程序會報無服務器證書異常;

dotnet dev-certs https -t信任證書,會彈窗提示確認安裝名為localhost的開發根證書:

- 否:web能正常啟動,Https請求將獲取無效證書,瀏覽器地址欄警示不安全(提示瀏覽器不信任localhost根證書,證書無效)

- 是:web正常啟動,瀏覽器發在地址欄顯示正常的Httsp小鎖?圖標

在Windows上,最安全方式是使用certificate store來注冊已認證的HTTPS,但是有時候希望在程序內綁定證書+私鑰, 這樣便于在不同平臺上部署。

文件證書

ASP.NET Core支持使用硬盤上文件證書來建立Https連接(這在linux上很常見)。

以下代碼允許Kestrel傳入文件證書和私鑰,并建立Https連接。

public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseKestrel(options => { options.Listen(IPAddress.Loopback, 5000); options.Listen(IPAddress.Loopback, 5001, listenOptions => { listenOptions.UseHttps("certificate.pfx", "topsecret"); }); }) .UseStartup;

務必確保不要將私鑰存儲在配置文件中:在開發模式,可使用user secrets 存儲此類密鑰;在生產模式,可考慮Azure Key Vault或環境變量。

更多密鑰分離策略請參考: 密鑰分離,.Net程序猿不再背鍋

總結

希望本文有助于您大致了解ASP.NET Core中Https的應用方式。

這不是什么高深的理論,而是嘗試以不同的方式啟用Https、并著重解釋相關中間件的用法。

END

掃碼

ASP.NET Core和Https

推薦閱讀:廣東視窗

手机麻将作弊管用吗 河内五分彩技巧公式 白小姐资料一肖中特马137 (*^▽^*)MG神奇的栈游戏网站 天天游招财鞭炮 (*^▽^*)MG摔角传奇援彩金 一码一波中特 (^ω^)MG疯狂世界盃官网 6场半全场计算器 (^ω^)MG富豪生活新手攻略 (*^▽^*)MG黄金之旅巨额大奖视频 安徽25选5开奖结果查询 6场半全场胜负要全中才有钱吗 (*^▽^*)MG热血羽毛球奖金赔率 (★^O^★)MG杂技群英会怎么玩 30选5今天开奖号码查询 河内五分彩在哪能玩