有時候,當你在瀏覽某些網站時,瀏覽器可能會彈出「您的連線不是私人連線」的警告,並提供一個「進階」選項。點擊後,你可能會看到「繼續前往(不安全)」的提示。這到底代表了什麼?
讓我們先來了解一些相關的名詞。
HTTP(HyperText Transfer Protocol)是網際網路上傳輸資料的基本協議,但它本身並不加密,這意味著傳輸的資料可能被攔截或查看,包括敏感資訊如帳號和密碼。HTTPS(HTTP Secure)則是 HTTP 的加密版本,利用 SSL/TLS 憑證來加密資料傳輸,確保資料在傳輸過程中的安全性和完整性,防止中間人攻擊等網路威脅。
SSL(Secure Sockets Layer)和其後續版本 TLS(Transport Layer Security)是安全協議,用於加密伺服器與客戶端之間的流量。當伺服器安裝了 SSL/TLS 憑證後,瀏覽器可以通過 HTTPS 與伺服器建立加密連接,確保資料在傳輸過程中不被竊取或篡改,保障用戶的資料安全。
CA(Certificate Authority,憑證授權機構)是負責簽發和驗證數位憑證的可信第三方機構。當網站向 CA 申請 SSL/TLS 憑證時,CA 會驗證該網站的身份,並在確認後簽發一個受信任的憑證。這個憑證能證明網站的合法性,讓用戶確信自己連接的是可信任的伺服器。
信任鏈是指從網站的 SSL/TLS 憑證開始,通過一系列中間憑證,最終追溯到根憑證的驗證過程。每個憑證都由上一級的 CA 簽署,形成一條完整的信任鏈。如果其中任何一個環節的憑證無效或不受信任,整個信任鏈就會中斷,瀏覽器就會顯示「連線不安全」的警告。這意味著雖然資料傳輸仍被加密,但無法確定伺服器的真實身份。
現在我們知道,這種警告通常表示網站的 SSL/TLS 憑證存在問題,可能是因為憑證過期、不受信任,或信任鏈無法驗證等原因。不過,即使瀏覽器顯示警告,網站的流量仍然是加密的,只是伺服器的身份無法確認,因此仍可能存在風險。
接下來,我們來介紹我們設計中的連線流程是如何運作的。
用戶請求伺服器:當用戶在瀏覽器中輸入網址並發出 HTTP 請求時,Nginx 伺服器會自動將所有的 HTTP 請求重定向至 HTTPS,讓客戶端使用安全的連線方式重新連接。
Nginx 反向代理處理請求:Nginx 接收到重新連接的 HTTPS 請求,並將瀏覽器的請求透過 HTTP 轉發給內部的 odoo 伺服器,同時提供 SSL/TLS 憑證給客戶,證明伺服器的身份。
憑證驗證:瀏覽器會檢查 Nginx 提供的 SSL/TLS 憑證,通過信任鏈進行驗證。如果憑證有效且信任鏈完整,瀏覽器會生成加密密鑰,與 Nginx 建立安全的加密通信通道。
建立加密的 HTTPS 通信:Nginx 與伺服器之間的資料傳輸將被加密,確保所有傳輸內容的機密性和完整性,防止資料在傳輸過程中被竊取或篡改;Nginx 跟 odoo 之間則仍然維持明碼傳輸的 HTTP 協議,不過因為他們聯絡的區域網路沒有外人可以進入(可參考從網路設計到 docker-compose:搭建 odoo 反向代理的第一步附圖),所以沒有洩漏或竄改的風險。
原本這一章就要實作這個主題,但不小心介紹得太多了,我們留到下一章再來詳細探討如何產生和設定這些憑證。