HTTPS 的原理和 NodeJS 的實現

2021-09-20 06:43:35 字數 1898 閱讀 6793

http協議採用明文傳輸資料,當涉及敏感資訊的傳送時,極有可能會受到竊聽或者中間人的攻擊。https是http與ssl/tls的組合,即使用加密通訊以及網路伺服器的身份鑑定來進行資訊的安全傳輸。其核心有二:

https鏈結的建立過程中涉及到伺服器端證書、客戶端證書(可選)、伺服器端的非對稱秘鑰以及後續通訊過程中使用的對稱秘鑰幾個內容。

客戶端對https的位址發出請求,並且將自己的ssl版本號等資訊傳送給伺服器

伺服器接收到請求,將伺服器證書和公鑰等資訊返回給客戶端

客戶端接收到證書後向證書頒發機構驗證證書的合法性。如果證書不合法(比如自行簽發的證書),則向使用者發出警告並確認是否繼續,使用者可以選擇在此時離開終止https的鏈結。

證書合法或客戶端確認在不安全的情況下繼續,客戶端生成pre-master secret並且使用2中收到的伺服器公鑰加密後傳送給伺服器。如果是使用互動策略的tls,則同時需要將客戶端的證書傳送給伺服器。伺服器檢查客戶端的證書頒發機構是否在信任列表中,以及證書內容是否合法。若不合法,結束本次會話。

伺服器使用私鑰解密pre-master secret,然後雙方通過一種實現商定好的加密演算法生成本次通訊使用的master secret

雙方互相通知對方本次ssl握手成功,其後均使用master secret對傳輸內容進行加密。

下圖簡要的說明了這個流程的實現。

一開始我也心存疑問:為什麼要單獨使用另外一組對稱秘鈅來實現對資訊的加密而不直接使用伺服器和客戶端雙方的非對稱秘鑰呢?我自身非常認同下面這個回答的解釋:

傳輸過程使用對稱金鑰是因為對稱加密比非對稱加密的運算量低乙個數量級以上,所以這樣的方式可以提高雙方會話的運算速度。

對於加密演算法不是非常了解,希望大牛指點一二。

https中乙個關鍵就是證書檔案。當然我們可以找專業的第三方機構簽發。自己玩玩的話就用自簽名的證書就可以了,使用者在訪問的時候則需要確認安全性問題。

1、生成傳輸pre-master secret的時候所需要的server端的私鑰,執行時提示需要輸入密碼,用於對key的加密。以後每次讀取此檔案的時候,都需要輸入指令。

# 生成伺服器端的非對稱秘鑰

openssl genrsa -des3 -out server.key 1024

# 生成簽名請求的csr檔案

openssl req -new -key server.key -out server.csr

# 自己對證書進行簽名,簽名的有效期是365天

openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

# 去除證書檔案的password

cp server.key server.key.orig

openssl rsa -in server.key.orig -out server.key

最終在建立https鏈結中使用的檔案是

//https預設de監聽埠時443,啟動1000以下的埠時需要sudo許可權

這裡使用的fs.readfilesync方法會阻塞其他程序直到檔案的讀取完畢,在讀取關鍵的配置檔案的時候這樣的方法是比較適宜的。

HTTPS的過程和原理

1.握手的時候使用的非對稱加密演算法 用來加密握手之後的請求和應答 2.傳輸資訊的時候使用的對稱加密,3.保證資料的完整性用的是hash演算法 數字簽名 在了解https之前,得先了解對稱加密和非對稱加密 對稱加密 這就是對稱加密演算法,其中圖中的金鑰s同時扮演加密和解密的角色。具體細節不是本文範疇...

https服務的原理和實現

目前大部分大型 已經全部切換到了https服務,所以很有必要了解整個https的原理,https是如何保證資訊保安的。這裡希望大家對以下部分名詞有一定的了解 了解https的原理,最好的方法就是走一遍流程,理論上的流程和原理通過以下幾點來解釋 證書申請 證書信任 密文通訊 https的關鍵之一就是s...

http認證原理和https

一.基礎介紹 在url前加https 字首表明是用ssl加密的。你的電腦與伺服器之間收發的資訊傳輸將更加安全。web伺服器啟用ssl需要獲得乙個伺服器證書並將該證書與要使用ssl的伺服器繫結。http和https使用的是完全不同的連線方式,用的埠也不一樣,前者是80,後者是443。http的連線很簡...