偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

TLS、SSL、CA 證書、公鑰、私鑰...今天捋一捋!

網(wǎng)絡(luò) 通信技術(shù)
通過 HTTPS,客戶端可以確認(rèn)服務(wù)端的身份,保證數(shù)據(jù)在傳輸過程中不被篡改,當(dāng)我們?cè)谧约旱臑g覽器上與某一個(gè)網(wǎng)站建立 HTTPS 連接的時(shí)候,滿足如下情況可以表示這個(gè)服務(wù)端可以被信任。

松哥最近在和小伙伴們連載 gRPC,如何確保 gRPC 通信的安全性?這就涉及到 TSL 了,但是考慮到可能有小伙伴對(duì)加密連接這一整套方案比較陌生,因此我們今天先用一篇文章跟大家捋清楚這些概念,概念搞明白了,再來看 TSL+gRPC 就很容易了。

1. HTTP 的問題

HTTP 協(xié)議是超文本傳輸協(xié)議(Hyper Text Transfer Protocol)的縮寫,它是從 WEB 服務(wù)器傳輸超文本標(biāo)記語言 HTML 到本地瀏覽器的傳送協(xié)議。HTTP 設(shè)計(jì)之初是為了提供一種發(fā)布和接收 HTML 頁面的方法,時(shí)至今日,它的作用已經(jīng)不僅僅于此了。

對(duì)于我們 Java 工程師而言,HTTP 應(yīng)該算是再熟悉不過的東西了,目前 HTTP 有多個(gè)版本,使用較多的是 HTTP/1.1 版本。

然而 HTTP 協(xié)議有一個(gè)缺陷那就是它是通過明文傳輸數(shù)據(jù)的,用戶通過 HTTP 協(xié)議傳輸?shù)膬?nèi)容很容易被惡意攔截,并且黑客可以偽裝成服務(wù)端,向用戶傳送錯(cuò)誤的信息,并且能輕易獲取用戶的隱私信息,而這些操作用戶是完全無感知的。

由于存在這樣的安全隱患,現(xiàn)在小伙伴們見到的大部分網(wǎng)站都在逐步轉(zhuǎn)為 HTTPS,HTTP 網(wǎng)站會(huì)越來越少了。

2. HTTPS

HTTPS(HyperText Transfer Protocol Secure)中文譯作超文本傳輸安全協(xié)議,這是一種通過計(jì)算機(jī)網(wǎng)絡(luò)進(jìn)行安全通訊的傳輸協(xié)議。

HTTPS 本質(zhì)上還是由 HTTP 進(jìn)行通信,只是在 HTTP 協(xié)議和 TCP 層之間增加了一個(gè) SSL 的安全傳輸協(xié)議。整個(gè)傳輸?shù)募用苓^程都在新的安全層 SSL/TLS 中實(shí)現(xiàn),而原來的 HTTP 層的傳輸流程保持不變,這樣就很好地兼容了舊的 HTTP 協(xié)議,也沿襲了 TCP/IP 協(xié)議族的分層思想。

通過 HTTPS,客戶端可以確認(rèn)服務(wù)端的身份,保證數(shù)據(jù)在傳輸過程中不被篡改,當(dāng)我們?cè)谧约旱臑g覽器上與某一個(gè)網(wǎng)站建立 HTTPS 連接的時(shí)候,滿足如下情況可以表示這個(gè)服務(wù)端可以被信任:

  1. 首先我們的操作系統(tǒng)中安裝了正確且受信任的證書。我們?cè)?cmd 命令行中執(zhí)行 ??certmgr.msc?? 命令,可以查看操作系統(tǒng)已經(jīng)安裝的證書列表。

圖片

  1. 瀏覽器本身正確實(shí)現(xiàn)了 HTTPS。
  2. 被訪問的網(wǎng)站提供了一個(gè)證書,這個(gè)證書是由一個(gè)操作系統(tǒng)所信任的證書頒發(fā)機(jī)構(gòu)簽發(fā)的,操作系統(tǒng)所信任的證書頒發(fā)機(jī)構(gòu)一般都預(yù)裝在操作系統(tǒng)中,通過第一步的方式可以查看。
  3. 被訪問的網(wǎng)站所提供的證書被成功認(rèn)證。

這里邊涉及到一些證書和協(xié)議的概念,接下來松哥和大家把整個(gè)過程捋一捋。

3. TLS/SSL

前面我們提到,HTTPS 就是在 HTTP 的基礎(chǔ)之上增加了 TLS/SSL,那么這兩個(gè)東西該如何理解呢?

SSL/TLS 是一種密碼通信方案,算是目前使用最廣泛的密碼通信方案了。SSL 全稱是 Secure Socket Layer,中文譯作安全套接層,是 1994 年由 Netscape 公司設(shè)計(jì)的一套協(xié)議,并與 1995 年發(fā)布了 3.0 版本;TLS 全稱是 Transport Layer Security,中文譯作傳輸層安全,則是 IETF 在 SSL3.0 基礎(chǔ)上設(shè)計(jì)的協(xié)議,實(shí)際上相當(dāng)于 SSL 的后續(xù)版本,目前 TLS 先后迭代了 ??TLS 1.0???、??TLS 1.1???、??TLS 1.2??? 和 ??TLS 1.3???,目前被廣泛使用的是 ??TLS 1.2?? 版本。

SSL/TLS 涉及到了密碼學(xué)中的對(duì)稱加密、非對(duì)稱加密、數(shù)字簽名等等,算是密碼學(xué)領(lǐng)域里的集大成者了。

3.1 TLS

接下來我們就來看看 TLS 如何確保 HTTP 安全。

為了確??蛻舳撕头?wù)端之間的數(shù)據(jù)安全,我們很容易想到一種方案就是對(duì)傳輸?shù)臄?shù)據(jù)進(jìn)行加密,沒錯(cuò),這是一個(gè)辦法,事實(shí)上也是這么做的。

加密又分為兩種:

  1. 對(duì)稱加密
  2. 非對(duì)稱加密

那么該使用哪一種呢?

對(duì)稱加密,也就是加密密鑰和解密密鑰是同一個(gè),當(dāng)瀏覽器和服務(wù)端需要進(jìn)行通信的時(shí)候,約定好一個(gè)密鑰,然后使用這個(gè)密鑰對(duì)發(fā)送的消息進(jìn)行加密,對(duì)方收到消息之后再使用相同的密鑰對(duì)消息進(jìn)行解密。但是,在 B/S 架構(gòu)的項(xiàng)目中,這種方案顯然不合適,一個(gè)網(wǎng)站把自己的密鑰告訴全世界所有的瀏覽器,那加密和不加密還有區(qū)別嗎?

有小伙伴可能又想到了不對(duì)稱加密,不對(duì)稱加密倒是個(gè)辦法,因?yàn)椴粚?duì)稱加密是有一個(gè)密鑰對(duì)公鑰和私鑰,公鑰可以公布出來告訴所有人,私鑰只有自己知道。通信的時(shí)候,客戶端首先使用公鑰對(duì)消息進(jìn)行加密,服務(wù)端收到之后,再通過私鑰對(duì)消息進(jìn)行解密,這看起來似乎挺完美的。但是?。?!非對(duì)稱加密存在一個(gè)問題,就是非對(duì)稱加密和解密相當(dāng)耗時(shí),通過這種方式處理加解密效率太低。

那怎么辦?我們可以將兩者結(jié)合起來。

具體來說,就是這樣:首先服務(wù)端會(huì)生成一個(gè)非對(duì)稱加密的密鑰對(duì),私鑰自己保存,公鑰發(fā)送給客戶端,客戶端拿到這個(gè)公鑰之后,再生成一個(gè)對(duì)稱加密的密鑰,然后把對(duì)稱加密的密鑰通過公鑰進(jìn)行加密,加密之后發(fā)送給服務(wù)端,服務(wù)端通過私鑰進(jìn)行解密,這樣客戶端和服務(wù)端就可以通過對(duì)稱加密進(jìn)行通信了。

事實(shí)上,TLS 大致上的思路就是這樣的。

不過上面這個(gè)方案還是有一個(gè)漏洞,那就是服務(wù)端要通過明文傳輸?shù)姆绞桨压€發(fā)送給客戶端,這個(gè)過程還是不安全的,可能被人惡意截胡,那么這個(gè)問題該如何解決呢?

這就涉及到另外一個(gè)概念叫做數(shù)字證書了。

3.2 CA

數(shù)字證書是一個(gè)包含了目標(biāo)網(wǎng)站各種信息如網(wǎng)站域名、證書有效期、簽發(fā)機(jī)構(gòu)、用于生成對(duì)稱密鑰的公鑰、上級(jí)證書簽發(fā)的簽名等的文件,通過數(shù)字證書我們可以確認(rèn)一個(gè)用戶或者服務(wù)站點(diǎn)的身份。

實(shí)際場(chǎng)景中的數(shù)字證書是一系列的,形成了一個(gè)信任鏈,信任鏈的最頂端是 CA。

CA 是 Certificate Authority 的簡(jiǎn)寫,它是一個(gè)負(fù)責(zé)發(fā)放和管理數(shù)字的證書的第三方權(quán)威機(jī)構(gòu)。CA 的工作流程是這樣的:

  1. CA 自己給自己頒發(fā)的用自己的私鑰簽名的證書稱為根證書,根證書的私鑰安全性至關(guān)重要,根證書的私鑰都是被保存在離線計(jì)算機(jī)中,有嚴(yán)格的操作規(guī)章,每次需要使用時(shí),會(huì)有專人將數(shù)據(jù)通過 USB 拷貝過去,操作完了以后,再將數(shù)據(jù)帶出來(這個(gè)專指 CA 根證書的私鑰)。
  2. 一個(gè)用戶想要獲取一個(gè)證書,首先自己得有一個(gè)密鑰對(duì),私鑰自己留著,公鑰以及其他信息發(fā)送給 CA,向 CA 提出申請(qǐng),CA 判明用戶的身份之后,會(huì)將這個(gè)公鑰和用戶的身份信息綁定,并且為綁定后的信息進(jìn)行簽名(簽名是通過 CA 根證書的私鑰進(jìn)行的),最后將簽名后的證書發(fā)給申請(qǐng)者。
  3. 一個(gè)用戶想要鑒定一個(gè)證書的真?zhèn)?,就通過 CA 的公鑰對(duì)證書上的數(shù)字簽名進(jìn)行驗(yàn)證,驗(yàn)證通過,就認(rèn)為這個(gè)這個(gè)證書是有效的。

上面這個(gè)流程中有一個(gè)重要前提,那就是 CA 受到大家所有人的信任。

然而在實(shí)際操作中,我們并不能直接去跟 CA 申請(qǐng)一個(gè)數(shù)字證書,因?yàn)槿澜缫J(rèn)證的內(nèi)容太多了,CA 搞不過來,而且頻繁的找 CA 申請(qǐng),還有可能導(dǎo)致私鑰泄漏,這可就是一個(gè)大的災(zāi)難了。

那怎么辦呢?實(shí)際操作中,我們可以基于 CA 來構(gòu)建一個(gè)信任鏈。具體來說,步驟是這樣:

  1. 首先我們的手機(jī)、筆記本等操作系統(tǒng)中都預(yù)裝了 CA 頒發(fā)的根證書,他們是所有信任構(gòu)建的基石,前面松哥已經(jīng)截圖給大家看了 Windows 中預(yù)裝的根證書了。
  2. 假設(shè) CA 簽發(fā)了一個(gè)證書 A,在這個(gè)過程中 CA 稱為 Issuer,A 稱為 Subject,假設(shè) A 是一個(gè)受信任的中間證書,已經(jīng)預(yù)裝在我們的操作系統(tǒng)中了?,F(xiàn)在由 A 利用它自己的私鑰給某一個(gè)網(wǎng)站簽發(fā)了一個(gè)證書 B。
  3. 現(xiàn)在當(dāng)我們的電腦需要訪問該網(wǎng)站的時(shí)候,該網(wǎng)站就會(huì)給我們發(fā)來一個(gè)證書 B,由于我們的瀏覽器并不知道 B 證書是否合法,但是我們的電腦上已經(jīng)預(yù)裝了 A 證書,我們可以從 A 證書中提取出 A 的公鑰,然后利用 A 的公鑰對(duì) B 證書的簽名進(jìn)行驗(yàn)證(因?yàn)?B 證書的簽名是 A 的私鑰簽的),如果驗(yàn)證通過了,就說明 B 是合法的。
  4. 相同的道理,B 也可以繼續(xù)簽發(fā) C 證書,C 繼續(xù)簽發(fā) D 證書,這樣就形成了一個(gè)信任鏈。
  5. 如果服務(wù)端的簽名是 D 證書,那么一般來說,服務(wù)器返回給瀏覽器的就會(huì)包含 B、C、D 三個(gè)證書(因?yàn)?A 證書已經(jīng)在我們的電腦上了),即使只返回 D 證書,瀏覽器也可以根據(jù) D 書中的信息,自動(dòng)下載到 B、C 兩個(gè)證書然后進(jìn)行驗(yàn)證。

松哥記得以前上大學(xué)的時(shí)候,在 12306 網(wǎng)站上買火車票,第一次訪問的時(shí)候必須要自己先手動(dòng)安裝一個(gè)根證書到系統(tǒng)中,然后才能訪問。這就是因?yàn)楫?dāng)時(shí) 12306 所使用的證書的簽發(fā)機(jī)構(gòu)不被瀏覽器認(rèn)可,類似于上面的第 3 步,12306 給我發(fā)了一個(gè)數(shù)字證書 B 回來,但是瀏覽器上沒有合適的公鑰對(duì)這個(gè) B 證書進(jìn)行驗(yàn)證,當(dāng)我往自己的系統(tǒng)上安裝了 12306 給的證書之后,相當(dāng)于我的電腦上有了一個(gè)證書 A,現(xiàn)在就可以對(duì) B 證書進(jìn)行驗(yàn)證了。

總結(jié)一下:

  1. CA 是一個(gè)權(quán)威的機(jī)構(gòu),是一個(gè)發(fā)證機(jī)關(guān),CA 發(fā)出來的證書可以證明一個(gè)人或者組織的身份。
  2. 任何人都可以得到 CA 的證書(含公鑰),用以驗(yàn)證 CA 所簽發(fā)的證書。
  3. 每一個(gè)數(shù)字證書都是由上級(jí)證書的私鑰來簽發(fā)的,處于最頂層的就是 CA 簽發(fā)的根證書了,這個(gè)根證書沒有上級(jí)證書了,所以這個(gè)根證書實(shí)際上是由 CA 自己的私鑰來簽發(fā)的,這也叫做自簽名,即 Self-Signed。

當(dāng)我們有了數(shù)字簽名之后,就可以解決 3.1 小節(jié)最后提出的問題了。服務(wù)端將數(shù)字簽名發(fā)給瀏覽器,瀏覽器利用系統(tǒng)已經(jīng)內(nèi)置的公鑰驗(yàn)簽,確認(rèn)簽名沒問題,然后就提取出來數(shù)字簽名中的公鑰,開始協(xié)商對(duì)稱加密的私鑰了~

好啦,有了這些知識(shí)儲(chǔ)備之后,下篇文章松哥來和大家聊一聊 TLS+gRPC 怎么玩!

責(zé)任編輯:武曉燕 來源: 江南一點(diǎn)雨
相關(guān)推薦

2021-07-07 22:27:54

磁盤分區(qū)硬盤

2021-11-04 18:15:55

下載上傳瀏覽器

2024-05-06 12:23:00

GenAI人工智能

2021-05-17 10:50:15

系統(tǒng)調(diào)用內(nèi)核

2020-12-18 06:09:07

Java淺拷貝深拷貝

2020-05-18 14:12:41

PostgreSQLDB架構(gòu)數(shù)據(jù)庫

2021-03-10 10:00:31

Go語言strconv包類型轉(zhuǎn)換工具

2019-02-18 14:18:04

2023-11-28 12:42:56

數(shù)據(jù)分析管理

2009-10-28 10:24:26

2018-09-03 13:39:43

手機(jī)蘋果iPhone

2022-08-17 11:36:18

Vue3插件

2023-07-13 08:12:26

ControllerSpring管理

2021-03-11 07:14:01

Epoll原理線程

2021-02-03 12:47:09

Spring Boot應(yīng)用監(jiān)控

2021-04-01 06:23:24

CSS33D3D Web 動(dòng)畫

2021-04-23 10:38:52

Spring BootSpringMVC源碼

2009-10-28 10:20:10

2021-07-12 23:21:52

MyISAM引擎InnoDB

2022-09-13 10:40:48

Flowable功能Spring
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)