WeHelp
初探 HTTPS 運作方式
2024-07-14 03:02:59
## Why not HTTP? 由於 HTTP 傳輸時,並不會將重要資料進行加密傳輸,因此任何重要資料(信用卡、密碼、聯絡電話...等),皆有可能在傳輸的過程中被有心人士擷取。因此 HTTPS 的存在就是為了解決上述問題。舉 Wehelp Bootcamp 第二階段的台北一日遊網站為例,當 User 在註冊頁面輸入帳號密碼,並使用 POST Request 送出至後端 Server 時,JSON 格式資料會: `被壓縮 (Compress,移除多餘空格) --> 轉換成 Binary 資料 --> 透過傳輸介質 (Transmission medium) 傳遞電子訊號(利用電位差產生的電子訊號產生0101資訊)` 如果我們是用 WIFI 傳遞資訊的話,駭客只要買一個便宜的訊號偵測器就可以攔截電子訊號,再將其還原成 JSON 資料,我們的重要資訊就外洩了。 ## HTTPS 運作方式 HTTPS 的 S 代表 Secure ,但要如何做到恰如其名的安全傳輸?答案是透過金鑰加密處理,經過金鑰加密後的資料,縱使被駭客擷取也只是一串亂碼,無法還原成重要資料。但這裡就會遇到兩個難題:1. Server 如果沒金鑰的話沒辦法解析 Client 傳遞的密碼 2. Client 如果透過 HTTP 將金鑰傳給 Server,金鑰有可能在傳遞過程被盜取。 這時候該怎麼辦呢?解法是透過 Asymmetric Encryption (非對稱式加密)。(可搭配影片服用:[12:43](https://www.youtube.com/watch?v=EnY6fSng3Ew&t=763#t=12:43.14) ) ## Asymmetric Encryption 非對稱加密的方式是:一開始會生成兩支金鑰,分別為公鑰 (Public key)、私鑰 (Private key),而公鑰私鑰可以分別扮演加密、解密的角色,只要其中一支鑰匙扮演加密的角色,另一支鑰匙就扮演解密的角色。(可搭配影片服用:[18:15](https://www.youtube.com/watch?v=EnY6fSng3Ew&t=1096#t=18:15.92) ) ![image](wehelp-storage://bb6b3706db27803c26250cf5fa61812e) *我們沒辦法拿同一支鑰匙同時加密與解密同一筆資料。* 在實際資料傳遞的過程中,Server 會同時存放公鑰與私鑰。公鑰被全世界知道也沒差,但是私鑰絕對不可外流。而資料傳遞的過程如下: 1. 開始建立連線時, Client 會發出 Request 告訴 Server 想要傳遞資料 2. Server 收到 Request 後,會回傳公鑰。 3. User 收到公鑰後,使用公鑰將「自己身上的鑰匙」進行加密,並將該鑰匙回傳給 server 。[20:51](https://www.youtube.com/watch?v=EnY6fSng3Ew&t=1251#t=20:51.27) ![image](wehelp-storage://29b31a8418d691fef0ce4f91551d23fc) 4. server 收到使用者的鑰匙後,使用私鑰成功將其解密。如此一來兩個人身上都有同一把鑰匙了。[22:12](https://www.youtube.com/watch?v=EnY6fSng3Ew&t=1333#t=22:12.62) ![image](wehelp-storage://8297c9e5793b1dd9c5488f8cd214a5c1) 5. 但是駭客有可能在第一步 client 想要建立加密連線的時候,就在中間截斷訊號,並提前回傳一個假的公鑰,騙取使用者用假的公鑰製作自己的鑰匙。因此我們必須確保公鑰是如實地來自 Server。[24:17](https://www.youtube.com/watch?v=EnY6fSng3Ew&t=1457#t=24:17.43) 6. 這時候我們要透過公正第三方(數位憑證認證機構 Certificate Authorities , CA)提供認證,證明公鑰是來自真正的 Server。在 Server 收到 Client 的 Request後,會將自己的公鑰傳遞給CA,CA 則會負責製作證書(certificate)回傳給 server。證書包含三項內容: 1. Server 的資訊 2. Server 公鑰 3. CA 用自己的私鑰將 server 公鑰進行加密製作的鑰匙(簽章 Signature) 7. Server 把證書回傳給 client。 8. Client 使用 CA 的公鑰將證書中 Signature 解密,如果解密後的鑰匙跟證書中的「Server 公鑰」長得一樣,就代表是真正的鑰匙囉。 ### 小結 補充說明,前面聊到的整個過程,其實就是 TLS 加密, TLS 原本應該是 SSL 加密的 3.1 版本,但因為 SSL 是 Netscape 開發的,為了區隔彼此關係而在發布前改名(詳見: https://www.cloudflare.com/zh-tw/learning/ssl/transport-layer-security-tls/ )。觀念通了,下次我們就來挑戰使用 NGINX 把現有的台北一日遊進行 HTTPS 加密吧! #### 參考資料 - 圖片來源:https://www.youtube.com/watch?v=EnY6fSng3Ew - Binary 資料: 影片 [03:50](https://www.youtube.com/watch?v=EnY6fSng3Ew&t=230#t=03:50.30) - 傳輸介質: 影片 [05:44](https://www.youtube.com/watch?v=EnY6fSng3Ew&t=344#t=05:44.23) - 訊號擷取器:影片 [10:08](https://www.youtube.com/watch?v=EnY6fSng3Ew&t=609#t=10:08.77)