松哥最近在和小伙伴們連載 gRPC,如何確保 gRPC 通信的安全性?這就涉及到 TSL 了,但是考慮到可能有小伙伴對加密連接這一整套方案比較陌生,因此我們今天先用一篇文章跟大家捋清楚這些概念,概念搞明白了,再來看 TSL+gRPC 就很容易了。
1. HTTP 的問題HTTP 協議是超文本傳輸協議(Hyper Text Transfer Protocol)的縮寫,它是從 WEB 服務器傳輸超文本標記語言 HTML 到本地瀏覽器的傳送協議。HTTP 設計之初是為了提供一種發布和接收 HTML 頁面的方法,時至今日,它的作用已經不僅僅于此了。
對于我們 Java 工程師而言,HTTP 應該算是再熟悉不過的東西了,目前 HTTP 有多個版本,使用較多的是 HTTP/1.1 版本。
(資料圖片僅供參考)
然而 HTTP 協議有一個缺陷那就是它是通過明文傳輸數據的,用戶通過 HTTP 協議傳輸的內容很容易被惡意攔截,并且黑客可以偽裝成服務端,向用戶傳送錯誤的信息,并且能輕易獲取用戶的隱私信息,而這些操作用戶是完全無感知的。
由于存在這樣的安全隱患,現在小伙伴們見到的大部分網站都在逐步轉為 HTTPS,HTTP 網站會越來越少了。
2. HTTPSHTTPS(HyperText Transfer Protocol Secure)中文譯作超文本傳輸安全協議,這是一種通過計算機網絡進行安全通訊的傳輸協議。
HTTPS 本質上還是由 HTTP 進行通信,只是在 HTTP 協議和 TCP 層之間增加了一個 SSL 的安全傳輸協議。整個傳輸的加密過程都在新的安全層 SSL/TLS 中實現,而原來的 HTTP 層的傳輸流程保持不變,這樣就很好地兼容了舊的 HTTP 協議,也沿襲了 TCP/IP 協議族的分層思想。
通過 HTTPS,客戶端可以確認服務端的身份,保證數據在傳輸過程中不被篡改,當我們在自己的瀏覽器上與某一個網站建立 HTTPS 連接的時候,滿足如下情況可以表示這個服務端可以被信任:
首先我們的操作系統中安裝了正確且受信任的證書。我們在 cmd 命令行中執行??certmgr.msc?
?命令,可以查看操作系統已經安裝的證書列表。瀏覽器本身正確實現了 HTTPS。被訪問的網站提供了一個證書,這個證書是由一個操作系統所信任的證書頒發機構簽發的,操作系統所信任的證書頒發機構一般都預裝在操作系統中,通過第一步的方式可以查看。被訪問的網站所提供的證書被成功認證。這里邊涉及到一些證書和協議的概念,接下來松哥和大家把整個過程捋一捋。
3. TLS/SSL前面我們提到,HTTPS 就是在 HTTP 的基礎之上增加了 TLS/SSL,那么這兩個東西該如何理解呢?
SSL/TLS 是一種密碼通信方案,算是目前使用最廣泛的密碼通信方案了。SSL 全稱是 Secure Socket Layer,中文譯作安全套接層,是 1994 年由 Netscape 公司設計的一套協議,并與 1995 年發布了 3.0 版本;TLS 全稱是 Transport Layer Security,中文譯作傳輸層安全,則是 IETF 在 SSL3.0 基礎上設計的協議,實際上相當于 SSL 的后續版本,目前 TLS 先后迭代了??TLS 1.0?
??、??TLS 1.1?
??、??TLS 1.2?
??和??TLS 1.3?
??,目前被廣泛使用的是??TLS 1.2?
?版本。
SSL/TLS 涉及到了密碼學中的對稱加密、非對稱加密、數字簽名等等,算是密碼學領域里的集大成者了。
3.1 TLS接下來我們就來看看 TLS 如何確保 HTTP 安全。
為了確??蛻舳撕头斩酥g的數據安全,我們很容易想到一種方案就是對傳輸的數據進行加密,沒錯,這是一個辦法,事實上也是這么做的。
加密又分為兩種:
對稱加密非對稱加密那么該使用哪一種呢?
對稱加密,也就是加密密鑰和解密密鑰是同一個,當瀏覽器和服務端需要進行通信的時候,約定好一個密鑰,然后使用這個密鑰對發送的消息進行加密,對方收到消息之后再使用相同的密鑰對消息進行解密。但是,在 B/S 架構的項目中,這種方案顯然不合適,一個網站把自己的密鑰告訴全世界所有的瀏覽器,那加密和不加密還有區別嗎?
有小伙伴可能又想到了不對稱加密,不對稱加密倒是個辦法,因為不對稱加密是有一個密鑰對公鑰和私鑰,公鑰可以公布出來告訴所有人,私鑰只有自己知道。通信的時候,客戶端首先使用公鑰對消息進行加密,服務端收到之后,再通過私鑰對消息進行解密,這看起來似乎挺完美的。但是?。?!非對稱加密存在一個問題,就是非對稱加密和解密相當耗時,通過這種方式處理加解密效率太低。
那怎么辦?我們可以將兩者結合起來。
具體來說,就是這樣:首先服務端會生成一個非對稱加密的密鑰對,私鑰自己保存,公鑰發送給客戶端,客戶端拿到這個公鑰之后,再生成一個對稱加密的密鑰,然后把對稱加密的密鑰通過公鑰進行加密,加密之后發送給服務端,服務端通過私鑰進行解密,這樣客戶端和服務端就可以通過對稱加密進行通信了。
事實上,TLS 大致上的思路就是這樣的。
不過上面這個方案還是有一個漏洞,那就是服務端要通過明文傳輸的方式把公鑰發送給客戶端,這個過程還是不安全的,可能被人惡意截胡,那么這個問題該如何解決呢?
這就涉及到另外一個概念叫做數字證書了。
3.2 CA數字證書是一個包含了目標網站各種信息如網站域名、證書有效期、簽發機構、用于生成對稱密鑰的公鑰、上級證書簽發的簽名等的文件,通過數字證書我們可以確認一個用戶或者服務站點的身份。
實際場景中的數字證書是一系列的,形成了一個信任鏈,信任鏈的最頂端是 CA。
CA 是 Certificate Authority 的簡寫,它是一個負責發放和管理數字的證書的第三方權威機構。CA 的工作流程是這樣的:
CA 自己給自己頒發的用自己的私鑰簽名的證書稱為根證書,根證書的私鑰安全性至關重要,根證書的私鑰都是被保存在離線計算機中,有嚴格的操作規章,每次需要使用時,會有專人將數據通過 USB 拷貝過去,操作完了以后,再將數據帶出來(這個專指 CA 根證書的私鑰)。一個用戶想要獲取一個證書,首先自己得有一個密鑰對,私鑰自己留著,公鑰以及其他信息發送給 CA,向 CA 提出申請,CA 判明用戶的身份之后,會將這個公鑰和用戶的身份信息綁定,并且為綁定后的信息進行簽名(簽名是通過 CA 根證書的私鑰進行的),最后將簽名后的證書發給申請者。一個用戶想要鑒定一個證書的真偽,就通過 CA 的公鑰對證書上的數字簽名進行驗證,驗證通過,就認為這個這個證書是有效的。上面這個流程中有一個重要前提,那就是 CA 受到大家所有人的信任。
然而在實際操作中,我們并不能直接去跟 CA 申請一個數字證書,因為全世界要認證的內容太多了,CA 搞不過來,而且頻繁的找 CA 申請,還有可能導致私鑰泄漏,這可就是一個大的災難了。
那怎么辦呢?實際操作中,我們可以基于 CA 來構建一個信任鏈。具體來說,步驟是這樣:
首先我們的手機、筆記本等操作系統中都預裝了 CA 頒發的根證書,他們是所有信任構建的基石,前面松哥已經截圖給大家看了 Windows 中預裝的根證書了。假設 CA 簽發了一個證書 A,在這個過程中 CA 稱為 Issuer,A 稱為 Subject,假設 A 是一個受信任的中間證書,已經預裝在我們的操作系統中了?,F在由 A 利用它自己的私鑰給某一個網站簽發了一個證書 B?,F在當我們的電腦需要訪問該網站的時候,該網站就會給我們發來一個證書 B,由于我們的瀏覽器并不知道 B 證書是否合法,但是我們的電腦上已經預裝了 A 證書,我們可以從 A 證書中提取出 A 的公鑰,然后利用 A 的公鑰對 B 證書的簽名進行驗證(因為 B 證書的簽名是 A 的私鑰簽的),如果驗證通過了,就說明 B 是合法的。相同的道理,B 也可以繼續簽發 C 證書,C 繼續簽發 D 證書,這樣就形成了一個信任鏈。如果服務端的簽名是 D 證書,那么一般來說,服務器返回給瀏覽器的就會包含 B、C、D 三個證書(因為 A 證書已經在我們的電腦上了),即使只返回 D 證書,瀏覽器也可以根據 D 書中的信息,自動下載到 B、C 兩個證書然后進行驗證。松哥記得以前上大學的時候,在 12306 網站上買火車票,第一次訪問的時候必須要自己先手動安裝一個根證書到系統中,然后才能訪問。這就是因為當時 12306 所使用的證書的簽發機構不被瀏覽器認可,類似于上面的第 3 步,12306 給我發了一個數字證書 B 回來,但是瀏覽器上沒有合適的公鑰對這個 B 證書進行驗證,當我往自己的系統上安裝了 12306 給的證書之后,相當于我的電腦上有了一個證書 A,現在就可以對 B 證書進行驗證了。
總結一下:
CA 是一個權威的機構,是一個發證機關,CA 發出來的證書可以證明一個人或者組織的身份。任何人都可以得到 CA 的證書(含公鑰),用以驗證 CA 所簽發的證書。每一個數字證書都是由上級證書的私鑰來簽發的,處于最頂層的就是 CA 簽發的根證書了,這個根證書沒有上級證書了,所以這個根證書實際上是由 CA 自己的私鑰來簽發的,這也叫做自簽名,即 Self-Signed。當我們有了數字簽名之后,就可以解決 3.1 小節最后提出的問題了。服務端將數字簽名發給瀏覽器,瀏覽器利用系統已經內置的公鑰驗簽,確認簽名沒問題,然后就提取出來數字簽名中的公鑰,開始協商對稱加密的私鑰了~
好啦,有了這些知識儲備之后,下篇文章松哥來和大家聊一聊 TLS+gRPC 怎么玩!
關鍵詞:
X 關閉
X 關閉
- 15G資費不大降!三大運營商誰提供的5G網速最快?中國信通院給出答案
- 2聯想拯救者Y70發布最新預告:售價2970元起 迄今最便宜的驍龍8+旗艦
- 3亞馬遜開始大規模推廣掌紋支付技術 顧客可使用“揮手付”結賬
- 4現代和起亞上半年出口20萬輛新能源汽車同比增長30.6%
- 5如何讓居民5分鐘使用到各種設施?沙特“線性城市”來了
- 6AMD實現連續8個季度的增長 季度營收首次突破60億美元利潤更是翻倍
- 7轉轉集團發布2022年二季度手機行情報告:二手市場“飄香”
- 8充電寶100Wh等于多少毫安?鐵路旅客禁止、限制攜帶和托運物品目錄
- 9好消息!京東與騰訊續簽三年戰略合作協議 加強技術創新與供應鏈服務
- 10名創優品擬通過香港IPO全球發售4100萬股 全球發售所得款項有什么用處?