HTTP到HTTPS
HTTP的缺點(diǎn)
在進(jìn)行 HTTP 通信時(shí)权谁,信息可能會(huì)監(jiān)聽、服務(wù)器或客戶端身份偽裝等安全問題憋沿。HTTPS 則能有效解決這些問題。這里就簡(jiǎn)單了解下 HTTPS沪猴。
HTTP 日常使用極為廣泛的協(xié)議辐啄,它很優(yōu)秀且方便,但還是存在一些問題运嗜,如:
– 明文通信壶辜,內(nèi)容可以直接被竊聽
– 無法驗(yàn)證報(bào)文的完整性,可能被篡改
– 通信方身份不驗(yàn)證担租,可能遇到假的客戶端或服務(wù)器
1.1 明文通信砸民,內(nèi)容可以直接被竊聽
HTTP 不會(huì)對(duì)請(qǐng)求和響應(yīng)的內(nèi)容進(jìn)行加密,報(bào)文直接使用明文發(fā)送奋救。報(bào)文在服務(wù)器與客戶端流轉(zhuǎn)中間岭参,會(huì)經(jīng)過若干個(gè)結(jié)點(diǎn),這些結(jié)點(diǎn)中隨時(shí)都可能會(huì)有竊聽行為尝艘。
因?yàn)橥ㄐ乓欢〞?huì)經(jīng)過中間很多個(gè)結(jié)點(diǎn)演侯,所以就算是報(bào)文經(jīng)過了加密,也一樣會(huì)被竊聽到背亥,不過是竊聽到加密后的內(nèi)容秒际。要竊聽相同段上的通信還是很簡(jiǎn)單的,比如可以使用常用的抓包工具 Wireshark狡汉。
那如何保護(hù)信息的安全呢娄徊?最常用的就是加密技術(shù)了。加密方式可以根據(jù)加密對(duì)象分以下幾種:
通信加密
HTTP 協(xié)議基于 TCP/IP 協(xié)議族盾戴,它沒有加密機(jī)制寄锐。但可以通過 SSL(Secure Socket Layer,安全套接層)建立安全的通信線路,再進(jìn)行 HTTP 通信锐峭,這種與 SSL 結(jié)合使用的稱為 HTTPS(HTTP Secure中鼠,超文本傳安全協(xié)議)。
內(nèi)容加密
還可以對(duì)通信內(nèi)容本身加密沿癞。HTTP 協(xié)議中沒有加密機(jī)制援雇,但可以對(duì)其傳輸?shù)膬?nèi)容進(jìn)行加密,也就是對(duì)報(bào)文內(nèi)容進(jìn)行加密椎扬。這種加密方式要求客戶端對(duì) HTTP 報(bào)文進(jìn)行加密處理后再發(fā)送給服務(wù)器端惫搏,服務(wù)器端拿到加密后的報(bào)文再進(jìn)行解密。這種加密方式不同于 SSL 將整個(gè)通信線路進(jìn)行加密蚕涤,所以它還是有被篡改的風(fēng)險(xiǎn)的筐赔。
1.2 無法驗(yàn)證報(bào)文的完整性,可能被篡改
接收到的內(nèi)容可能被做假
HTTP 協(xié)議是無法證明通信報(bào)文的完整性的揖铜。因此請(qǐng)求或響應(yīng)在途中隨時(shí)可能被篡改而不自知茴丰,也就是說,沒有任何辦法確認(rèn)天吓,發(fā)出的請(qǐng)求/響應(yīng)和接收到的請(qǐng)求/響應(yīng)是前后相同的贿肩。
比如瀏覽器從某個(gè)網(wǎng)站上下載一個(gè)文件,它是無法確定下載的文件和服務(wù)器上有些話的文件是同一個(gè)文件的龄寞。文件在傳輸過程中被掉包了也是不知道的汰规。
這種請(qǐng)求或響應(yīng)在傳輸途中,被攔截物邑、篡改的攻擊就是中間人攻擊溜哮。
某運(yùn)營商就經(jīng)常干這種事,打開百度色解、網(wǎng)易什么的茂嗓,中間直接來個(gè)大大的廣告,你懂的…
防止篡改
也有一些 HTTP 協(xié)議確定報(bào)文完整性的方法冒签,不過這些方法很不方便在抛,也不太可靠。用得最多的就是 MD5 等散列值校驗(yàn)的方法萧恕。很多文件下載服務(wù)的網(wǎng)站都會(huì)提供相應(yīng)文件的 MD5 散列值刚梭,一來得用戶親自去動(dòng)手校驗(yàn)(中國估計(jì)只有 0.1% 不到的用戶懂得怎么做吧),二來如果網(wǎng)站提供的 MD5 值也被改寫的話呢票唆?所以這種方法不方便也不可靠朴读。
1.3 通信方身份不驗(yàn)證,可能遇到假的客戶端或服務(wù)器
在進(jìn)行 HTTP 通信時(shí)走趋,請(qǐng)求和響應(yīng)方都不會(huì)對(duì)通信方進(jìn)行身份確認(rèn)衅金。這也會(huì)給人以可乘之機(jī)。
任何人都可以發(fā)起、響應(yīng)請(qǐng)求
在 HTTP 通信時(shí)氮唯,由于服務(wù)器不確認(rèn)請(qǐng)求發(fā)起方的身份鉴吹,所以任何設(shè)備都可以發(fā)起請(qǐng)求,服務(wù)器會(huì)對(duì)每一個(gè)接收到的請(qǐng)求進(jìn)行響應(yīng)(當(dāng)然惩琉,服務(wù)器可以限制 IP 地址和端口號(hào))豆励。由于服務(wù)器會(huì)響應(yīng)所有接收到的請(qǐng)求,所以有人就利用這一點(diǎn)瞒渠,給服務(wù)器發(fā)起海量的無意義的請(qǐng)求良蒸,造成服務(wù)器無法響應(yīng)正式的請(qǐng)求,這就是 Dos 攻擊(Denial Of Service伍玖,拒絕服務(wù)攻擊)嫩痰。
由于客戶端也不會(huì)驗(yàn)證服務(wù)器是否真實(shí),所以遇到來自假的服務(wù)器的響應(yīng)時(shí)窍箍,客戶端也不知道串纺,只能交由人來判斷。釣魚網(wǎng)站就是利用了這一點(diǎn)椰棘。
查明對(duì)方的證書
HTTP 協(xié)議無法確認(rèn)通信方造垛,而 SSL 則是可以的。SSL 不僅提供了加密處理晰搀,還提供了叫做“證書”的手段,用于確定通信方的身份办斑。
證書是由值得信任的第三方機(jī)構(gòu)頒發(fā)(已獲得社會(huì)認(rèn)可的企業(yè)或組織機(jī)構(gòu))的外恕,用以證明服務(wù)器和客戶端的身份。而且偽造證書從目前的技術(shù)來看乡翅,是一件極為難的事情鳞疲,所以證書往往可以確定通信方的身份。
以客戶端訪問網(wǎng)頁為例蠕蚜∩星ⅲ客戶端在開始通信之前,先向第三機(jī)機(jī)構(gòu)確認(rèn) Web 網(wǎng)站服務(wù)器的證書的有效性靶累,再得到其確認(rèn)后腺毫,再開始與服務(wù)器進(jìn)行通信。
HTTPS
2.1 HTTP + 加密 + 認(rèn)證 + 完整性保護(hù) = HTTPS
HTTPS 也就是 HTTP 加上加密處理挣柬、認(rèn)證以及完整性保護(hù)潮酒。HTTP 協(xié)議在通信過程如果沒有使用加密的明文,比如在 Web 頁面輸入手機(jī)號(hào)邪蛔,如果這條通信線路再竊聽急黎,那么手機(jī)號(hào)就被別人知道了。
另外,在 HTTP 中勃教,服務(wù)器和客戶端都無法確認(rèn)通信方淤击,說不定就是正在和某個(gè)騙子通信呢。還得考慮報(bào)文在通信過程中有沒有被篡改故源。
為了解決上面這些問題污抬,可以在 HTTP 上加入加密處理和認(rèn)證機(jī)制。這種添加了加密及認(rèn)證機(jī)制的 HTTP 就叫做 HTTPS(HTTP Secure)心软。
使用 HTTPS 通信時(shí)壕吹,用的是 https://,而不是 http://删铃。另外耳贬,當(dāng)瀏覽器訪問 HTTPS 的 Web 網(wǎng)站時(shí),瀏覽器地址欄會(huì)出現(xiàn)一個(gè)帶鎖的標(biāo)記猎唁。
2.2 HTTPS 是 HTTP 披了層 SSL 的外殼
HTTPS 并非是應(yīng)用層的新協(xié)議咒劲,而是 HTTP 通信接口部分用 SSL 協(xié)議代替而已。
本來诫隅,HTTP 是直接和 TCP 通信腐魂。在 HTTPS 中,它先和 SSL 通信逐纬,SSL 再和 TCP 通信蛔屹。所以說 HTTPS 是披了層 SSL 外殼的 HTTP。
SSL 是獨(dú)立于 HTTP 的協(xié)議豁生,所以其他類似于 HTTP 的應(yīng)用層 SMTP 等協(xié)議都可以配合 SSL 協(xié)議使用兔毒,也可以給它們?cè)鰪?qiáng)安全性。
2.3 SSL 密鑰
加密
數(shù)據(jù)在傳輸過程中甸箱,很容易被竊聽育叁。加密就是保護(hù)數(shù)據(jù)安全的措施。一般是利用技術(shù)手段把數(shù)據(jù)變成亂碼(加密)傳送芍殖,到達(dá)目的地后豪嗽,再利用對(duì)應(yīng)的技術(shù)手段還原數(shù)據(jù)(解密)。
加密包含算法和密鑰兩個(gè)元素豌骏。算法將要加密的數(shù)據(jù)與密鑰(一竄數(shù)字)相結(jié)合龟梦,產(chǎn)生不可理解的密文。由此可見肯适,密鑰與算法同樣重要变秦。
對(duì)數(shù)據(jù)加密技術(shù)可以分為兩類:私人密鑰加密(對(duì)稱密鑰加密)和公開密鑰加密(非對(duì)稱密鑰加密)。
SSL 采用了 公開密鑰加密(Public-key cryptography)的加密處理方式框舔。
現(xiàn)在的加密方法中蹦玫,加密算法都是公開的赎婚,網(wǎng)上都有各種算法原理解析的內(nèi)容。加密算法雖然是公開的樱溉,算法用到的密鑰卻是保密的挣输,以此來保持加密方法的安全性。
加密和解密都會(huì)用到密鑰福贞。有了密鑰就可以解密了撩嚼,如果密鑰被攻擊者獲得,加密也就沒有意義了挖帘。
私人密鑰
私人密鑰加密就是加密和解密用的是同一個(gè)密鑰完丽,這也稱為對(duì)稱密鑰加密。
私人密鑰加密存在這樣一個(gè)問題拇舀,必須要將密鑰發(fā)送給對(duì)方逻族。但如何才能安全地轉(zhuǎn)交密鑰呢?如果在互聯(lián)網(wǎng)上轉(zhuǎn)交密鑰時(shí)骄崩,被監(jiān)聽了聘鳞,那加密也就沒有意義了。也就是說要拂,只要在互聯(lián)網(wǎng)上發(fā)送密鑰抠璃,就有被竊聽的風(fēng)險(xiǎn),但如果不發(fā)送脱惰,對(duì)方怎么解密呢搏嗡?再說,如果密鑰能夠安全發(fā)送拉一,那數(shù)據(jù)不也應(yīng)該能安全送達(dá)么彻况!
公開密鑰加密
公開密鑰加密方式能很好地解決私人密鑰加密的困難。
公開密鑰加密方式有兩把密鑰舅踪。一把叫做私有密鑰(private key),另一把叫做公開密鑰(public key)良蛮。私有密鑰是一方保管抽碌,而公開密鑰則誰都可以獲得。
這種方式是需要發(fā)送密文的一方先獲得對(duì)方的公開密鑰决瞳,使用已知的算法進(jìn)行加密處理货徙。對(duì)方收到被加密的信息后,再使用自己的私有密鑰進(jìn)行解密皮胡。
這種加密方式有意思是的加密算法的神奇痴颊,經(jīng)過這個(gè)公開的算法加密后的密文,即使知道公開密鑰屡贺,也是無法對(duì)密文還原的蠢棱。要想對(duì)密文進(jìn)行解決锌杀,必須要有私鑰才行。所以公開密鑰加密是非常安全的泻仙,即使竊聽到密文和公開密鑰糕再,卻還是無法進(jìn)行解密。
混合加密
公開密鑰加密很安全玉转,但與私人密鑰加密相比突想,由于公開密鑰加密的算法復(fù)雜性,導(dǎo)致它的加密和解密處理速度都比私人密鑰加密慢很多究抓,效率很低猾担。所以可以充分利用它們各自的優(yōu)勢(shì),結(jié)合起來刺下。
先用公開密鑰加密绑嘹,交換私人密鑰加密會(huì)用的密鑰,之后的通信交換則使用私人密鑰方式怠李。這就是混合加密圾叼。
1) 使用公開密鑰加密方式安全地交換在稍后的私人密鑰加密中要使用的密鑰
2)確保交換的密鑰是安全的前提下,使用私人密鑰加密方式進(jìn)行通信
2.4 公開密鑰證書
其實(shí)捺癞,公開密鑰加密方式還存在一個(gè)很大的問題:它無法證明公開密鑰本身是真實(shí)的公開密鑰夷蚊。比如,打算跟銀行的服務(wù)器建立公開密鑰加密方式的通信時(shí)髓介,怎么證明收到的公開密鑰就是該服務(wù)器的密鑰呢惕鼓?畢竟,要調(diào)包公開密鑰是極為簡(jiǎn)單的唐础。
這時(shí)箱歧,數(shù)字證書認(rèn)證機(jī)構(gòu)(CA,Certificated Authority)就出場(chǎng)了一膨。
數(shù)字證書認(rèn)證機(jī)構(gòu)是具有權(quán)威性呀邢、公正性的機(jī)構(gòu)。它的業(yè)務(wù)流程是:首先豹绪,服務(wù)器的開發(fā)者向數(shù)字證書認(rèn)證機(jī)構(gòu)提出公開密鑰(服務(wù)器公開密鑰)的申請(qǐng)价淌。數(shù)字證書認(rèn)證機(jī)構(gòu)在核實(shí)申請(qǐng)者的身份之后,會(huì)用自己的公開密鑰(數(shù)字簽名公開密鑰)對(duì)申請(qǐng)的公開密鑰做數(shù)字簽名瞒津,再將 服務(wù)器公開密鑰蝉衣、數(shù)字簽名以及申請(qǐng)者身份等信息放入公鑰證書。
服務(wù)器則將這份由數(shù)字證書認(rèn)證機(jī)構(gòu)頒發(fā)的公鑰證書發(fā)送給客戶端巷蚪,以進(jìn)行公開密鑰加密方式通信病毡。公鑰證書也可做數(shù)字證書或簡(jiǎn)稱為為證書。證書就相當(dāng)于是服務(wù)器的身份證屁柏。
客戶端接到證書后啦膜,使用 數(shù)字簽名公開密鑰 對(duì)數(shù)字簽名進(jìn)行驗(yàn)證有送,當(dāng)驗(yàn)證通過時(shí),也就證明了:1功戚、真實(shí)有效的數(shù)字證書認(rèn)證機(jī)構(gòu)娶眷。2、真實(shí)有效的服務(wù)器公開密鑰啸臀。然后就可能與服務(wù)器安全通信了届宠。
其實(shí)這里還是有一個(gè)問題的。那就是如何將 數(shù)字簽名公開密鑰 安全地轉(zhuǎn)給客戶端乘粒?難道再去另一個(gè)認(rèn)證機(jī)制那確認(rèn)(現(xiàn)在是真有的)豌注?無疑,安全轉(zhuǎn)交是一件困難的事灯萍。因此轧铁,常用的認(rèn)證機(jī)關(guān)的公開密鑰會(huì)被很多瀏覽器內(nèi)置在里面守伸。
EV SSL(增強(qiáng)型)證書
證書作用這一是證明服務(wù)器是否規(guī)范鳖目,另一個(gè)作用是可以確認(rèn)服務(wù)器背后的企業(yè)是否真實(shí)烤礁。具有這種特性的證書就是 EV SSL (Extended Validation SSL Certificate)證書访惜。
EV SSL 證書是基于國際標(biāo)準(zhǔn)的嚴(yán)格身份驗(yàn)證頒發(fā)的證書。通過認(rèn)證的網(wǎng)站能獲得更高的認(rèn)可度勉失。
EV SSL 證書在視覺上最大的特色在于激活瀏覽器的地址欄的背景色是綠色泵琳。而且在地址欄中顯示了 SSL 證書中記錄的組織名稱哗总。
這個(gè)機(jī)制原本是為了防止用戶被釣魚攻擊的真屯,但效果如何還真不知道脸候,目前來看,很多用戶根本不清楚這是啥玩意兒绑蔫。
客戶端證書
客戶端也是可以有證書的运沦,讓服務(wù)器知道,正在通信的客戶端是可信任的配深。
相比之下携添,客戶端證書存在幾個(gè)問題。第一是證書的獲取和安裝篓叶。想要獲取證書時(shí)薪寓,還得用戶自行安裝,關(guān)鍵是客戶端證書還是要花錢買的澜共。另外,安裝這件事本身就有很多年長的人不太會(huì)锥腻。
所以嗦董,客戶端證書只在安全性要求級(jí)高的特殊情況下都會(huì)用。比如網(wǎng)上專業(yè)銀行瘦黑,在登錄時(shí)京革,不僅要用戶名和密碼奇唤,還要用個(gè)U盾。
客戶端的另一個(gè)問題是匹摇,客戶端證書只能證明客戶端的存在咬扇,卻不能證明是用戶本人在操作。也許是還證書都被盜了呢廊勃?
認(rèn)證機(jī)構(gòu)被黑
SSL 的安全建立在認(rèn)證機(jī)構(gòu)絕對(duì)可靠這一前提之下懈贺。但認(rèn)證機(jī)構(gòu)也有成功被黑的時(shí)候。在 2011年7月10號(hào)坡垫,荷蘭的一家名叫 DigiNotar(同年9月20號(hào)宣布破產(chǎn)) 的認(rèn)證機(jī)構(gòu)被黑窩入侵梭灿,還頒布了 google.com、twitter.com 等網(wǎng)站的偽造證書冰悠,走到8月28號(hào)才被伊朗發(fā)現(xiàn)堡妒。這一事件從根本上撼動(dòng)了 SSL 的可信度。
因?yàn)閭卧熳C書上有正規(guī)認(rèn)證機(jī)構(gòu)的數(shù)字簽名溉卓,所以瀏覽器會(huì)判定該證書是正常的皮迟。當(dāng)偽造的證書被用于服務(wù)器偽裝時(shí),用戶根本無法察覺桑寨。
雖然微軟伏尼、蘋果、Opera 等瀏覽器廠商積極采取了措施西疤,不過生效卻是要一段時(shí)間的烦粒,這段時(shí)間內(nèi)造成的用戶的損失有多大就不知道了。
OpenSSL
OpenSSL 是用 C 寫的一套 SSL 和 TLS 開源實(shí)現(xiàn)代赁。這也就意味著人人都可以基于這個(gè)構(gòu)建屬于自己的認(rèn)證機(jī)構(gòu)扰她,然后給自己的頒發(fā)服務(wù)器證書。不過然并卵芭碍,其證書不可在互聯(lián)網(wǎng)上作為證書使用徒役。
這種自認(rèn)證機(jī)構(gòu)給自己頒發(fā)的證書,叫做自簽名證書窖壕。自己給自己作證忧勿,自然是算不得數(shù)的。所以瀏覽器在訪問這種服務(wù)器時(shí)瞻讽,會(huì)顯示“無法確認(rèn)連接安全性”等警告消息鸳吸。
OpenSSL 在2014年4月,被爆出一個(gè)內(nèi)存溢出引出的 BUG速勇,駭客利用這點(diǎn)能拿到服務(wù)器很多信息晌砾,其中就包括私鑰,也就使得 HTTPS 形同虛設(shè)烦磁。當(dāng)時(shí)全世界大概有一百萬左右的服務(wù)器有受到此漏洞的影響养匈。由于 OpenSSL 舉足輕重的作用哼勇,再加上足夠致命的問題,使得這個(gè) BUG 被形容為“互聯(lián)網(wǎng)心臟出血”呕乎。這是近年來互聯(lián)網(wǎng)最嚴(yán)重的安全事件积担。
HTTPS 缺點(diǎn)
HTTPS 使用 SSL 通信,所以它的處理速度會(huì)比 HTTP 要慢猬仁。
一是通信慢帝璧。它和 HTTP 相比,網(wǎng)絡(luò)負(fù)載會(huì)變慢 2 到 100倍逐虚。除去和 TCP 連接聋溜、發(fā)送 HTTP 請(qǐng)求及響應(yīng)外,還必須進(jìn)行 SSL 通信叭爱,因此整體上處理通信量會(huì)不可避免的增加撮躁。
二是 SSL 必須進(jìn)行加密處理。在服務(wù)器和客戶端都需要進(jìn)行加密和解密的去處處理买雾。所以它比 HTTP 會(huì)更多地消耗服務(wù)器和客戶端的硬件資源把曼。
由于 HTTPS 會(huì)消耗更多的資源,再者還要花錢購買證書漓穿,所以目前 HTTPS 一般只會(huì)用到敏感信息上嗤军。
不過雖然目前的硬件的快速發(fā)展,HTTPS 的資源消耗問題將不再是什么太大問題了晃危。另外叙赚,隨著移動(dòng)互聯(lián)網(wǎng)的快速發(fā)展,用戶信息泄露情況日益嚴(yán)重僚饭,也是非常有必要采用 HTTPS 來進(jìn)行通信的震叮。Apple 就在 iOS9 中鼓勵(lì)應(yīng)用積極使用 HTTPS。