http與Https協(xié)議詳解介紹
http協(xié)議大家可能都耳熟能詳了,但是它有一系列的缺點(diǎn),比如:
1.通信時(shí)使用明文,這樣有可能通信內(nèi)容會(huì)被竊聽(tīng);
2.不會(huì)驗(yàn)證通信方的身份,包括服務(wù)器和客戶(hù)端,特別是服務(wù)器,有可能你發(fā)送請(qǐng)求的對(duì)方是個(gè)釣魚(yú)網(wǎng)站;
3.無(wú)法驗(yàn)證報(bào)文的完整性(準(zhǔn)確度),有可能所有的報(bào)文會(huì)經(jīng)過(guò)黑客的服務(wù)器,黑客將內(nèi)容篡改后進(jìn)行轉(zhuǎn)發(fā),前后端都不會(huì)知曉,神不知鬼不覺(jué);
雖然http協(xié)議已經(jīng)非常強(qiáng)大了,但在安全這一塊確實(shí)是還有欠妥之處,于是一種安全的http協(xié)議-https運(yùn)用而生。
Https概述
https并不是一種新的協(xié)議,只是在http層下面添加了一層SSL層和TLS層(后面統(tǒng)稱(chēng)為SSL層),SSL層主要是做加密處理,http層直接與SSL層通信,如下圖所示:

一、加密技術(shù)
為了更好的了解https,從而保證了數(shù)據(jù)的安全性。下面介紹https用到的2種加密方式:
1.共享密鑰加密(對(duì)稱(chēng)密鑰加密)
加密和解密用同一個(gè)密鑰的方式,這種方式需要客戶(hù)端和服務(wù)器都知道這個(gè)密鑰,而單獨(dú)的發(fā)送這個(gè)密鑰有可能會(huì)被竊聽(tīng)的風(fēng)險(xiǎn),所以如何安全的發(fā)送這個(gè)密鑰又是一個(gè)新的難題。
所以尷尬境地是:發(fā)送密鑰吧,有可能被黑客竊取;不發(fā)送密鑰吧,對(duì)方就不能解密。
2.公開(kāi)密鑰加密(非對(duì)稱(chēng)密鑰加密)
這里使用了2把密鑰,一把叫私有密鑰(私鑰),一把叫公開(kāi)密鑰(公鑰),這2個(gè)密鑰是配對(duì)的一套密鑰,公鑰可以讓任何人都知道,而私鑰只有自己知道。
另外,對(duì)于一對(duì)公鑰私鑰而言:公鑰加密的內(nèi)容,只有私鑰才能解開(kāi);而私鑰加密的內(nèi)容,所有公鑰都可以解開(kāi)。
這種方式可以很好的解決上面對(duì)稱(chēng)密鑰加密方式的尷尬境地:對(duì)于一段內(nèi)容,發(fā)送方可以使用公鑰進(jìn)行加密發(fā)送給對(duì)方,接收方收到內(nèi)容后用自己的私鑰進(jìn)行解密,因?yàn)檫@樣不用發(fā)送解密的私鑰,從而不會(huì)落入黑客之手。
有的人會(huì)有這樣的擔(dān)心:難道黑客就不能截獲加密的內(nèi)容后破解加密的內(nèi)容嗎?但是我告訴你,破解的難度相當(dāng)大,就目前的技術(shù)來(lái)看不太現(xiàn)實(shí)。
二、混合加密技術(shù)-HTTPS
https采用上面2種加密方式的混合加密機(jī)制(公開(kāi)密鑰加密+共享密鑰加密),共享密鑰加密方式的密鑰用公開(kāi)密鑰加密方式加密后發(fā)送給對(duì)方,然后建立通信后的內(nèi)容采用共享密鑰加密方式。
為什么采用這種混合方式呢?因?yàn)楣_(kāi)加密方式與共享加密方式相比,它的處理速度要慢,所以采用公開(kāi)加密方式加密一次共享加密方式的密鑰后,后面的內(nèi)容則多次采用共享加密方式,這樣可以大大增加效率。

三、安全隱患
但是單純的采用這種混合加密方式,還是會(huì)出現(xiàn)安全問(wèn)題。為什么呢?設(shè)想一下,如果第一步向服務(wù)器請(qǐng)求公鑰的時(shí)候,服務(wù)器會(huì)返回真實(shí)的公鑰,這時(shí)候如果有黑客在中間做一些調(diào)包及轉(zhuǎn)發(fā)工作,客戶(hù)端無(wú)法知曉對(duì)方的服務(wù)器是否是真實(shí)的服務(wù)器。為了解決這一安全問(wèn)題,于是又添加了證書(shū)這一機(jī)制。
證書(shū)
數(shù)字證書(shū)(證書(shū))由數(shù)字證書(shū)認(rèn)證機(jī)構(gòu)(簡(jiǎn)稱(chēng)CA)頒發(fā)。CA何許人也?它是客戶(hù)端和服務(wù)器雙方都可信賴(lài)的權(quán)威的第三方機(jī)構(gòu)。它的任務(wù)就是頒發(fā)證書(shū),一般是給服務(wù)器頒發(fā)證書(shū),頒發(fā)證書(shū)后就意味著這個(gè)服務(wù)器網(wǎng)站是值得信賴(lài)的;也可給客戶(hù)端頒發(fā)證書(shū),但一般這種情況比較少見(jiàn),只用在一些特殊的業(yè)務(wù),比如:網(wǎng)上銀行等。
四、獲取證書(shū)
如何獲取證書(shū)呢?當(dāng)然是向CA申請(qǐng)及購(gòu)買(mǎi),交完錢(qián)后,它會(huì)給你服務(wù)器頒發(fā)一個(gè)證書(shū)。
也可以免費(fèi)申請(qǐng)證書(shū),比如:FreeSSL
有人可能會(huì)關(guān)心購(gòu)買(mǎi)證書(shū)的價(jià)格,這里隨便在網(wǎng)上截了個(gè)圖,可以大概了解下

五、證書(shū)的主要內(nèi)容
證書(shū)中主要包含有:頒發(fā)對(duì)象的信息,頒發(fā)者,過(guò)期時(shí)間,數(shù)字簽名等,完整信息如下圖:

拿百度網(wǎng)站為例,若是https網(wǎng)站,網(wǎng)址前面會(huì)有一把鎖,可以查看證書(shū),也可導(dǎo)出證書(shū)。


一、數(shù)字簽名的重要性
從上圖可以看到,證書(shū)中都會(huì)有數(shù)字簽名,那么什么是數(shù)字簽名呢?
數(shù)字簽名其實(shí)就是特殊的加密校驗(yàn)碼,客戶(hù)端在收到證書(shū)后會(huì)用瀏覽器內(nèi)置的CA相應(yīng)公鑰根據(jù)簽名算法對(duì)目標(biāo)網(wǎng)站進(jìn)行本地簽名,如果本地簽名與證書(shū)的簽名不一樣,則判定對(duì)方服務(wù)器是冒牌貨,停止傳輸。
上面提到為什么會(huì)用到瀏覽器內(nèi)置的CA公鑰呢?
數(shù)字證書(shū)認(rèn)證機(jī)構(gòu)的公開(kāi)密鑰必須安全的轉(zhuǎn)交給客戶(hù)端,那么如何轉(zhuǎn)交又是一件很困難的事(唉!困難重重?。。?,于是解決辦法是:大多數(shù)瀏覽器開(kāi)發(fā)商在發(fā)布版本時(shí),會(huì)事先在瀏覽器內(nèi)部植入常用認(rèn)證機(jī)構(gòu)的公開(kāi)密鑰。
HTTPS加密傳輸流程
通過(guò)上面一些基本知識(shí)講解,可以更好的理解https到底是怎么工作,怎么保證網(wǎng)絡(luò)安全的,流程如下:
1、瀏覽器請(qǐng)求目標(biāo)網(wǎng)站,服務(wù)器把證書(shū)發(fā)送給客戶(hù)端
2、客戶(hù)端會(huì)對(duì)證書(shū)進(jìn)行本地簽名校驗(yàn)(參考上面的數(shù)字簽名的重要性)
3、若校驗(yàn)成功,則客戶(hù)端瀏覽器會(huì)隨機(jī)生成一個(gè)共享加密方式(對(duì)稱(chēng)加密)的密鑰,然后會(huì)從證書(shū)中提取公鑰對(duì)剛剛生成的密鑰進(jìn)行加密,得到密文并發(fā)送給服務(wù)器
4、服務(wù)器收到密文后用自己的私鑰進(jìn)行解密,得到共享加密方式的密鑰
5、接下來(lái)的一系列的報(bào)文傳輸就采用共享加密方式,因?yàn)榇藭r(shí)雙方(客戶(hù)端、服務(wù)器)都擁有了共享加密方式的密鑰,接下來(lái)就可以安全的愉快的玩耍了

Python代碼中關(guān)于SSL驗(yàn)證的問(wèn)題
在我們寫(xiě)代碼時(shí)請(qǐng)求https網(wǎng)站時(shí)經(jīng)常會(huì)出現(xiàn)類(lèi)似“certificate verify failed”這樣的錯(cuò)誤。
這樣的錯(cuò)誤意思是SSL驗(yàn)證出錯(cuò)的問(wèn)題,說(shuō)白了,其實(shí)就是上面提到的數(shù)字簽名的校驗(yàn)的錯(cuò)誤。以Requests庫(kù)為例,內(nèi)部引入了pyOpenSSL庫(kù)
出現(xiàn)SSL錯(cuò)誤的代碼:
import requests headers = { 'user-agent' : 'Mozilla/5.0 (Windows NT 6.1; W…) Gecko/20100101 Firefox/59.0' } r = requests.get('https://hcaidcs.phe.org.uk/WebPages/GeneralHomePage.aspx', verify= True) print(r.status_code)
結(jié)果如下所示:

參數(shù)verify默認(rèn)為T(mén)rue。其實(shí)就是對(duì)證書(shū)驗(yàn)證失敗,驗(yàn)證的目的就是確認(rèn)請(qǐng)求的目標(biāo)服務(wù)器是不是真實(shí)的服務(wù)器。
解決方案:
1.我客戶(hù)端干脆不驗(yàn)證,管你是不是真實(shí)的目標(biāo)網(wǎng)站。這種解決方案是網(wǎng)上最流行的解決方式
2.下載目標(biāo)網(wǎng)站證書(shū)后驗(yàn)證唄
3.安裝requests的security 版本
pip3 install requests[security ]
解決方案1:不驗(yàn)證
將verify=False即可,但會(huì)出現(xiàn)警告,可以使用requests.packages.urllib3.disable_warnings() 禁用警告
import requests headers = { 'user-agent' : 'Mozilla/5.0 (Windows NT 6.1; W…) Gecko/20100101 Firefox/59.0' } r = requests.get('https://hcaidcs.phe.org.uk/WebPages/GeneralHomePage.aspx', verify= False) print(r.status_code)

解決方案2:下載目標(biāo)網(wǎng)站驗(yàn)證
將目標(biāo)網(wǎng)站的證書(shū)導(dǎo)出保存起來(lái),如圖所示:

代碼如下:
import requests REQUESTS_CA_BUNDLE= r'e:/certificate/-pheorguk.crt' headers = { 'user-agent' : 'Mozilla/5.0 (Windows NT 6.1; W…) Gecko/20100101 Firefox/59.0' } r = requests.get('https://hcaidcs.phe.org.uk/WebPages/GeneralHomePage.aspx', verify= REQUESTS_CA_BUNDLE) print(r.status_code)
運(yùn)行結(jié)果:200 沒(méi)有任何錯(cuò)誤及警告

解決方案3:直接安裝安全版的requests,可以有效避免
pip3 install requests[security ]
來(lái)源:https://zhuanlan.zhihu.com/p/64233102/?utm_id=0