網(wǎng)絡(luò)編程之 Https 詳細(xì)分析,超詳細(xì)知識點(diǎn)!

01.為何會有Https
Http的缺點(diǎn)
通信使用明文
通信使用明文意味著安全性大大降低,當(dāng)通信過程被竊聽后,無需花費(fèi)額外的投入就可看到傳輸?shù)臄?shù)據(jù)。
例如使用抓包工具,無需任何配置就可查看任何使用HTTP協(xié)議的通信數(shù)據(jù);
不驗(yàn)證通信方身份
不驗(yàn)證通信方的身份,將導(dǎo)致通信過程被竊聽后,可能會遭遇偽裝,例如使用抓包工具抓取數(shù)據(jù)后,就可按照數(shù)據(jù)包的格式構(gòu)造HTTP請求;任何人都坑你發(fā)送請求,不管對方是誰都返回相應(yīng)。
無法驗(yàn)證報(bào)文的完整性
不驗(yàn)證報(bào)文的完整性,數(shù)據(jù)在傳輸過程中就可能被篡改,本來想看楊充呢,結(jié)果數(shù)據(jù)在傳輸過程中被換成了逗比。
遭到篡改,即沒有辦法確認(rèn)發(fā)出的請求/相應(yīng)前后一致。

Http的缺點(diǎn)解決方案
通信使用明文
既然明文不安全,那可以考慮使用密文,即:對通信數(shù)據(jù)進(jìn)行加密。即便數(shù)據(jù)被竊聽,對方依然需要花費(fèi)一定的投入來破解,這種高昂的成本間接提高安全級別。
不驗(yàn)證通信方身份
和服務(wù)端使用相同的算法,根據(jù)網(wǎng)絡(luò)請求參數(shù)生成一個token,請求/應(yīng)答時根據(jù)token來確定雙方的身份。
無法驗(yàn)證報(bào)文的完整性
使用MD5/SHA1等算法進(jìn)行完整性驗(yàn)證,對方接收到數(shù)據(jù)后,根據(jù)同樣的算法生成散列值,比對發(fā)送方生成的散列值,即可驗(yàn)證數(shù)據(jù)的完整性。
你知道Http存在哪些風(fēng)險嗎?
竊聽風(fēng)險:Http采用明文傳輸數(shù)據(jù),第三方可以獲知通信內(nèi)容
篡改風(fēng)險:第三方可以修改通信內(nèi)容
冒充風(fēng)險:第三方可以冒充他人身份進(jìn)行通信

如何解決這些風(fēng)險
SSL/TLS協(xié)議就是為了解決這些風(fēng)險而設(shè)計(jì),希望達(dá)到:所有信息加密傳輸,三方竊聽通信內(nèi)容;具有校驗(yàn)機(jī)制,內(nèi)容一旦被篡改,通信雙發(fā)立刻會發(fā)現(xiàn);配備身份證書,防止身份被冒充
SSL原理及運(yùn)行過程
SSL/TLS協(xié)議基本思路是采用公鑰加密法(最有名的是RSA加密算法)。大概流程是,客戶端向服務(wù)器索要公鑰,然后用公鑰加密信息,服務(wù)器收到密文,用自己的私鑰解密。
為了防止公鑰被篡改,把公鑰放在數(shù)字證書中,證書可信則公鑰可信。公鑰加密計(jì)算量很大,為了提高效率,服務(wù)端和客戶端都生成對話秘鑰,用它加密信息,而對話秘鑰是對稱加密,速度非常快。而公鑰用來機(jī)密對話秘鑰。
02.解決方案分析
Https加密方式

Https=Http+Ssl
Https保證了我們數(shù)據(jù)傳輸?shù)陌踩?,Https=Http+Ssl
之所以能保證安全主要的原理就是利用了非對稱加密算法,平常用的對稱加密算法之所以不安全,是因?yàn)殡p方是用統(tǒng)一的密匙進(jìn)行加密解密的,只要雙方任意一方泄漏了密匙,那么其他人就可以利用密匙解密數(shù)據(jù)。
非對稱加密算法之所以能實(shí)現(xiàn)安全傳輸?shù)暮诵木A就是:公鑰加密的信息只能用私鑰解開,私鑰加密的信息只能被公鑰解開。
非對稱加密算法為什么安全
服務(wù)端申請CA機(jī)構(gòu)頒發(fā)的證書,則獲取到了證書的公鑰和私鑰,私鑰只有服務(wù)器端自己知道,而公鑰可以告知其他人,如可以把公鑰傳給客戶端,這樣客戶端通過服務(wù)端傳來的公鑰來加密自己傳輸?shù)臄?shù)據(jù),而服務(wù)端利用私鑰就可以解密這個數(shù)據(jù)了。由于客戶端這個用公鑰加密的數(shù)據(jù)只有私鑰能解密,而這個私鑰只有服務(wù)端有,所以數(shù)據(jù)傳輸就安全了。
上面只是簡單說了一下非對稱加密算法是如何保證數(shù)據(jù)安全的,實(shí)際上Https的工作過程遠(yuǎn)比這要復(fù)雜。

03.SSL是什么
什么是SSL證書
Https協(xié)議中需要使用到SSL證書。SSL證書是一個二進(jìn)制文件,里面包含經(jīng)過認(rèn)證的網(wǎng)站公鑰和一些元數(shù)據(jù),需要從經(jīng)銷商購買。
證書有很多類型,按認(rèn)證級別分類:
域名認(rèn)證(DV=Domain Validation):最低級別的認(rèn)證,可以確認(rèn)申請人擁有這個域名
公司認(rèn)證(OV=Organization Validation):確認(rèn)域名所有人是哪家公司,證書里面包含公司的信息
擴(kuò)展認(rèn)證(EV=Extended Validation):最高級別認(rèn)證,瀏覽器地址欄會顯示公司名稱。
按覆蓋范圍分類:
單域名證書:只能用于單域名,foo.com證書不能用不www.foo.com
通配符證書:可用于某個域名及所有一級子域名,比如*.foo.com的證書可用于foo.com,也可用于www.foo.com
多域名證書:可用于多個域名,比如foo.com和bar.com
TLS/SSL的原理是什么?
SSL(Secure Sokcet Layer,安全套接字層)
TLS(Transport Layer Security,傳輸層安全協(xié)議)
04.RSA驗(yàn)證的隱患
SSL/TLS協(xié)議基本思路是采用公鑰加密法(最有名的是RSA加密算法),雖然說是采用非對稱加密,但還是有風(fēng)險隱患。
身份驗(yàn)證和密鑰協(xié)商是TLS的基礎(chǔ)功能,要求的前提是合法的服務(wù)器掌握著對應(yīng)的私鑰。但RSA算法無法確保服務(wù)器身份的合法性,因?yàn)楣€并不包含服務(wù)器的信息,存在安全隱患:
客戶端C和服務(wù)器S進(jìn)行通信,中間節(jié)點(diǎn)M截獲了二者的通信;
節(jié)點(diǎn)M自己計(jì)算產(chǎn)生一對公鑰pub_M和私鑰pri_M;
C向S請求公鑰時,M把自己的公鑰pub_M發(fā)給了C;
C使用公鑰 pub_M加密的數(shù)據(jù)能夠被M解密,因?yàn)镸掌握對應(yīng)的私鑰pri_M,而 C無法根據(jù)公鑰信息判斷服務(wù)器的身份,從而 C和 * M之間建立了"可信"加密連接;
中間節(jié)點(diǎn) M和服務(wù)器S之間再建立合法的連接,因此 C和 S之間通信被M完全掌握,M可以進(jìn)行信息的竊聽、篡改等操作。
另外,服務(wù)器也可以對自己的發(fā)出的信息進(jìn)行否認(rèn),不承認(rèn)相關(guān)信息是自己發(fā)出。
因此該方案下至少存在兩類問題:
中間人攻擊和信息抵賴
05.CA證書身份驗(yàn)證
CA 的初始是為了解決上面非對稱加密被劫持的情況,服務(wù)器申請CA證書時將服務(wù)器的“公鑰”提供給CA,CA使用自己的“私鑰”將“服務(wù)器的公鑰”加密后(即:CA證書)返回給服務(wù)器,服務(wù)器再將“CA證書”提供給客戶端。一般系統(tǒng)或者瀏覽器會內(nèi)置 CA 的根證書(公鑰),HTTPS 中 CA 證書的獲取流程如下所示:

注意:上圖步驟 2 之后,客戶端獲取到“CA 證書”會進(jìn)行本地驗(yàn)證,即使用本地系統(tǒng)或者瀏覽器中的公鑰進(jìn)行解密,每個“CA 證書”都會有一個證書編號可用于解密后進(jìn)行比對(具體驗(yàn)證算法請查閱相關(guān)資料)。步驟 5 之前使用的是對稱加密,之后將使用對稱加密來提高通訊效率。
CA證書流程原理
基本的原理為,CA負(fù)責(zé)審核信息,然后對關(guān)鍵信息利用私鑰進(jìn)行"簽名",公開對應(yīng)的公鑰,客戶端可以利用公鑰驗(yàn)證簽名。
CA也可以吊銷已經(jīng)簽發(fā)的證書,基本的方式包括兩類 CRL 文件和 OCSP。CA使用具體的流程如下:

在這個過程注意幾點(diǎn):
a.申請證書不需要提供私鑰,確保私鑰永遠(yuǎn)只能服務(wù)器掌握;
b.證書的合法性仍然依賴于非對稱加密算法,證書主要是增加了服務(wù)器信息以及簽名;
c.內(nèi)置 CA 對應(yīng)的證書稱為根證書,頒發(fā)者和使用者相同,自己為自己簽名,即自簽名證書(為什么說"部署自簽SSL證書非常不安全")
d.證書=公鑰+申請者與頒發(fā)者信息+簽名;
CA證書鏈
如 CA根證書和服務(wù)器證書中間增加一級證書機(jī)構(gòu),即中間證書,證書的產(chǎn)生和驗(yàn)證原理不變,只是增加一層驗(yàn)證,只要最后能夠被任何信任的CA根證書驗(yàn)證合法即可。
a.服務(wù)器證書 server.pem 的簽發(fā)者為中間證書機(jī)構(gòu) inter,inter 根據(jù)證書 inter.pem 驗(yàn)證 server.pem 確實(shí)為自己簽發(fā)的有效證書;
b.中間證書 inter.pem 的簽發(fā) CA 為 root,root 根據(jù)證書 root.pem 驗(yàn)證 inter.pem 為自己簽發(fā)的合法證書;
c.客戶端內(nèi)置信任 CA 的 root.pem 證書,因此服務(wù)器證書 server.pem 的被信任。

06.Https工作原理
HTTPS工作原理
一、首先HTTP請求服務(wù)端生成證書,客戶端對證書的有效期、合法性、域名是否與請求的域名一致、證書的公鑰(RSA加密)等進(jìn)行校驗(yàn);
二、客戶端如果校驗(yàn)通過后,就根據(jù)證書的公鑰的有效, 生成隨機(jī)數(shù),隨機(jī)數(shù)使用公鑰進(jìn)行加密(RSA加密);
三、消息體產(chǎn)生的后,對它的摘要進(jìn)行MD5(或者SHA1)算法加密,此時就得到了RSA簽名;
四、發(fā)送給服務(wù)端,此時只有服務(wù)端(RSA私鑰)能解密。
五、解密得到的隨機(jī)數(shù),再用AES加密,作為密鑰(此時的密鑰只有客戶端和服務(wù)端知道)。

詳細(xì)一點(diǎn)的原理流程
客戶端發(fā)起HTTPS請求
這個沒什么好說的,就是用戶在瀏覽器里輸入一個https網(wǎng)址,然后連接到server的443端口。
服務(wù)端的配置
采用HTTPS協(xié)議的服務(wù)器必須要有一套數(shù)字證書,可以自己制作,也可以向組織申請。區(qū)別就是自己頒發(fā)的證書需要客戶端驗(yàn)證通過,才可以繼續(xù)訪問,而使用受信任的公司申請的證書則不會彈出提示頁面(startssl就是個不錯的選擇,有1年的免費(fèi)服務(wù))。這套證書其實(shí)就是一對公鑰和私鑰。如果對公鑰和私鑰不太理解,可以想象成一把鑰匙和一個鎖頭,只是全世界只有你一個人有這把鑰匙,你可以把鎖頭給別人,別人可以用這個鎖把重要的東西鎖起來,然后發(fā)給你,因?yàn)橹挥心阋粋€人有這把鑰匙,所以只有你才能看到被這把鎖鎖起來的東西。
傳送證書
這個證書其實(shí)就是公鑰,只是包含了很多信息,如證書的頒發(fā)機(jī)構(gòu),過期時間等等。
客戶端解析證書
這部分工作是有客戶端的TLS來完成的,首先會驗(yàn)證公鑰是否有效,比如頒發(fā)機(jī)構(gòu),過期時間等等,如果發(fā)現(xiàn)異常,則會彈出一個警告框,提示證書存在問題。如果證書沒有問題,那么就生成一個隨機(jī)值。然后用證書對該隨機(jī)值進(jìn)行加密。就好像上面說的,把隨機(jī)值用鎖頭鎖起來,這樣除非有鑰匙,不然看不到被鎖住的內(nèi)容。
傳送加密信息
這部分傳送的是用證書加密后的隨機(jī)值,目的就是讓服務(wù)端得到這個隨機(jī)值,以后客戶端和服務(wù)端的通信就可以通過這個隨機(jī)值來進(jìn)行加密解密了。
服務(wù)端解密信息
服務(wù)端用私鑰解密后,得到了客戶端傳過來的隨機(jī)值(私鑰),然后把內(nèi)容通過該值進(jìn)行對稱加密。所謂對稱加密就是,將信息和私鑰通過某種算法混合在一起,這樣除非知道私鑰,不然無法獲取內(nèi)容,而正好客戶端和服務(wù)端都知道這個私鑰,所以只要加密算法夠彪悍,私鑰夠復(fù)雜,數(shù)據(jù)就夠安全。
傳輸加密后的信息
這部分信息是服務(wù)端用私鑰加密后的信息,可以在客戶端被還原。
客戶端解密信息
客戶端用之前生成的私鑰解密服務(wù)端傳過來的信息,于是獲取了解密后的內(nèi)容。整個過程第三方即使監(jiān)聽到了數(shù)據(jù),也束手無策。
07.Https代理作用
HTTPS代理的作用是什么?
代理作用:提高訪問速度、Proxy可以起到防火墻的作用、通過代理服務(wù)器訪問一些不能直接訪問的網(wǎng)站、安全性得到提高

08.Https真安全嗎
charles抓包原理圖

大概步驟流程
第一步,客戶端向服務(wù)器發(fā)起HTTPS請求,charles截獲客戶端發(fā)送給服務(wù)器的HTTPS請求,charles偽裝成客戶端向服務(wù)器發(fā)送請求進(jìn)行握手 。
第二步,服務(wù)器發(fā)回相應(yīng),charles獲取到服務(wù)器的CA證書,用根證書(這里的根證書是CA認(rèn)證中心給自己頒發(fā)的證書)公鑰進(jìn)行解密,驗(yàn)證服務(wù)器數(shù)據(jù)簽名,獲取到服務(wù)器CA證書公鑰。然后charles偽造自己的CA證書(這里的CA證書,也是根證書,只不過是charles偽造的根證書),冒充服務(wù)器證書傳遞給客戶端瀏覽器。
第三步,與普通過程中客戶端的操作相同,客戶端根據(jù)返回的數(shù)據(jù)進(jìn)行證書校驗(yàn)、生成密碼Pre_master、用charles偽造的證書公鑰加密,并生成HTTPS通信用的對稱密鑰enc_key。
第四步,客戶端將重要信息傳遞給服務(wù)器,又被charles截獲。charles將截獲的密文用自己偽造證書的私鑰解開,獲得并計(jì)算得到HTTPS通信用的對稱密鑰enc_key。charles將對稱密鑰用服務(wù)器證書公鑰加密傳遞給服務(wù)器。
第五步,與普通過程中服務(wù)器端的操作相同,服務(wù)器用私鑰解開后建立信任,然后再發(fā)送加密的握手消息給客戶端。
第六步,charles截獲服務(wù)器發(fā)送的密文,用對稱密鑰解開,再用自己偽造證書的私鑰加密傳給客戶端。
第七步,客戶端拿到加密信息后,用公鑰解開,驗(yàn)證HASH。握手過程正式完成,客戶端與服務(wù)器端就這樣建立了”信任“。
在之后的正常加密通信過程中,charles如何在服務(wù)器與客戶端之間充當(dāng)?shù)谌吣兀?/p>
服務(wù)器—>客戶端:charles接收到服務(wù)器發(fā)送的密文,用對稱密鑰解開,獲得服務(wù)器發(fā)送的明文。再次加密, 發(fā)送給客戶端。
客戶端—>服務(wù)端:客戶端用對稱密鑰加密,被charles截獲后,解密獲得明文。再次加密,發(fā)送給服務(wù)器端。由于charles一直擁有通信用對稱密鑰enc_key,所以在整個HTTPS通信過程中信息對其透明。
總結(jié)一下
HTTPS抓包的原理還是挺簡單的,簡單來說,就是Charles作為“中間人代理”,拿到了服務(wù)器證書公鑰和HTTPS連接的對稱密鑰,前提是客戶端選擇信任并安裝Charles的CA證書,否則客戶端就會“報(bào)警”并中止連接。這樣看來,HTTPS還是很安全的。
相對安全
從抓包的原理可以看出,對Https進(jìn)行抓包,需要PC端和手機(jī)端同時安裝證書。
既然這么容易被抓包,那Https會不會顯得很雞肋?其實(shí)并不會,能抓包,那是因?yàn)槟阈湃巫グぞ?,手機(jī)上安裝了與之對應(yīng)的證書,你要不安裝證書,你抓一個試試。而且安全這個課題,是在攻防中求發(fā)展,沒有最安全,只有更安全,所以將攻擊的成本提高了,就間接達(dá)到了安全的目標(biāo)。

09.Https性能優(yōu)化
HTTPS性能損耗
增加延時
分析前面的握手過程,一次完整的握手至少需要兩端依次來回兩次通信,至少增加延時2?RTT,利用會話緩存從而復(fù)用連接,延時也至少1?RTT*
消耗較多的CPU資源
除數(shù)據(jù)傳輸之外,HTTPS通信主要包括對對稱加解密、非對稱加解密(服務(wù)器主要采用私鑰解密數(shù)據(jù));壓測 TS8 機(jī)型的單核 CPU:對稱加密算法AES-CBC-256 吞吐量 600Mbps,非對稱 RSA 私鑰解密200次/s。不考慮其它軟件層面的開銷,10G 網(wǎng)卡為對稱加密需要消耗 CPU 約17核,24核CPU最多接入 HTTPS 連接 4800;靜態(tài)節(jié)點(diǎn)當(dāng)前10G 網(wǎng)卡的 TS8 機(jī)型的 HTTP 單機(jī)接入能力約為10w/s,如果將所有的HTTP連接變?yōu)镠TTPS連接,則明顯RSA的解密最先成為瓶頸。因此,RSA的解密能力是當(dāng)前困擾HTTPS接入的主要難題。
HTTPS接入優(yōu)化
CDN接入
HTTPS 增加的延時主要是傳輸延時 RTT,RTT 的特點(diǎn)是節(jié)點(diǎn)越近延時越小,CDN 天然離用戶最近,因此選擇使用 CDN 作為 HTTPS 接入的入口,將能夠極大減少接入延時。
CDN 節(jié)點(diǎn)通過和業(yè)務(wù)服務(wù)器維持長連接、會話復(fù)用和鏈路質(zhì)量優(yōu)化等可控方法,極大減少 HTTPS 帶來的延時。
會話緩存
雖然前文提到 HTTPS 即使采用會話緩存也要至少1*RTT的延時,但是至少延時已經(jīng)減少為原來的一半,明顯的延時優(yōu)化;同時,基于會話緩存建立的 HTTPS 連接不需要服務(wù)器使用RSA私鑰解密獲取 Pre-master 信息,可以省去CPU 的消耗。如果業(yè)務(wù)訪問連接集中,緩存命中率高,則HTTPS的接入能力講明顯提升。當(dāng)前TRP平臺的緩存命中率高峰時期大于30%,10k/s的接入資源實(shí)際可以承載13k/的接入,收效非??捎^。

硬件加速
為接入服務(wù)器安裝專用的SSL硬件加速卡,作用類似 GPU,釋放 CPU,能夠具有更高的 HTTPS 接入能力且不影響業(yè)務(wù)程序的。測試某硬件加速卡單卡可以提供35k的解密能力,相當(dāng)于175核 CPU,至少相當(dāng)于7臺24核的服務(wù)器,考慮到接入服務(wù)器其它程序的開銷,一張硬件卡可以實(shí)現(xiàn)接近10臺服務(wù)器的接入能力。
遠(yuǎn)程解密
本地接入消耗過多的 CPU 資源,浪費(fèi)了網(wǎng)卡和硬盤等資源,考慮將最消耗 CPU 資源的RSA解密計(jì)算任務(wù)轉(zhuǎn)移到其它服務(wù)器,如此則可以充分發(fā)揮服務(wù)器的接入能力,充分利用帶寬與網(wǎng)卡資源。遠(yuǎn)程解密服務(wù)器可以選擇 CPU 負(fù)載較低的機(jī)器充當(dāng),實(shí)現(xiàn)機(jī)器資源復(fù)用,也可以是專門優(yōu)化的高計(jì)算性能的服務(wù)器。當(dāng)前也是 CDN 用于大規(guī)模HTTPS接入的解決方案之一。
SPDY/HTTP2
前面的方法分別從減少傳輸延時和單機(jī)負(fù)載的方法提高 HTTPS 接入性能,但是方法都基于不改變 HTTP 協(xié)議的基礎(chǔ)上提出的優(yōu)化方法,SPDY/HTTP2 利用 TLS/SSL 帶來的優(yōu)勢,通過修改協(xié)議的方法來提升 HTTPS 的性能,提高下載速度等。
另外如果你想更好的提升你的編程能力,學(xué)好C語言C++編程!彎道超車,快人一步!
分享(源碼、項(xiàng)目實(shí)戰(zhàn)視頻、項(xiàng)目筆記,基礎(chǔ)入門教程)
歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長比自己琢磨更快哦!

學(xué)習(xí)C/C++編程知識,提升C/C++編程能力,歡迎關(guān)注UP一起來成長!
另外,UP在主頁上傳了一些學(xué)習(xí)C/C++編程的視頻教程,有興趣或者正在學(xué)習(xí)的小伙伴一定要去看一看哦!會對你有幫助的~
編程學(xué)習(xí)軟件分享:

編程學(xué)習(xí)視頻分享:
