為什么要有HTTPS
都說進技術的產生就是為了解決舊技術的一些弊端。
HTTP具有相當優秀的一面,但是凡事有利也有弊,在HTTP進行高速通信的過程中可能產生以下幾個問題:
HTTP采用明文傳輸。明文傳輸在一些需要保護個人隱私的場景是大忌,比如銀行卡卡號和密碼的輸入,個
人信息的錄入等。才用明文傳輸分分鍾鍾被不法分子截取下來,可能第二天我們就發現我們銀行卡里的錢不
翼而飛,我們的個人信息被賣給各種第三方,手機天天收到各種廣告信息。
HTTP不驗證通信雙方的身份。這就有意思了,電視劇經常有這么一種狗血劇情,女主角向長期在外的男主角
書寫想念之情,各種肉麻情話。然后將信交給丫鬟代為投遞給郵局,但是丫鬟愛慕男主角已久,為了破壞主子
和男主角之間的感情,模仿女主筆記,重新寫信給男主,當男主回信回來后,又冒充男主筆跡重寫信件,這樣
女主和男主都以為在和對方通信,誰知卻都被丫鬟從中作梗了。
HTTP無法驗證報文的完整性,報文可能被篡改。在上面的女主丫鬟男主的例子種,女主和男主的信件都被丫鬟
篡改了,而女主男主卻絲毫不知,這和HTTP報文被篡改的性質是一樣的。
因為可能產生以上幾種問題,所以出現了HTTPS
什么是HTTPS
HTTPS就是安全的HTTP。即HTTP+加密+認證+完整性保護 = HTTPS。目前很多網站都用到了HTTPS,最常見的就是支付網站。
說到HTTPS就不得不提到SSL協議。
SSL協議:SSL就是在不安全的TCP上做了安全加強,因此SSL是TCP的加強版,但是不能說SSL協議是新的傳輸層協議,
就像不能說HTTPS是新的應用層協議一樣,SSL和HTTPS都是在不安全的原協議上做了安全加強。
傳統的HTTP協議通信:傳統的HTTP報文是直接將報文信息傳輸到TCP然后TCP再通過TCP套接字發送給目的主機上。
HTTPS協議通信:HTTPS是HTTP報文直接將報文信息傳輸給SSL套接字進行加密,SSL加密后將加密后的報文發送給
TCP套接字,然后TCP套接字再將加密后的報文發送給目的主機,目的主機將通過TCP套接字獲取加密后的報文給SSL
套接字,SSL解密后交給對應進程。
由上我們可以看出HTTPS就是加個SSL外殼的HTTP
那么SSL又是使用什么方式進行加密解密呢。這里要談談共享密鑰加密和共有密鑰加密方式了
共享密鑰加密
共享密鑰加密也稱對稱密鑰加密。采用的是使用相同密鑰對報文進行加密解密
我們可以將共享密鑰加密這樣理解:我們把我們要給別人的東西放到一個箱子里面,然后給箱子上了一把鎖。當箱子到了我們想給的那個人
身上時,他也需要這把鑰匙才能開鎖。
這樣就產生了一個問題了,我們怎么將這把鑰匙安全的交給對方呢,如果鑰匙在半路被人截取了,那么對箱子有沒有加鎖有什么區別呢。因此
共享密鑰加密需要解決的一個大問題就是如何安全的將密鑰交給解密方。
公開密鑰加密
非對稱加密和解密使用的密鑰不是同一把密鑰,其中一把對外界公開,被稱作公鑰,另一個只有所有者知道,被稱為私鑰。用公鑰加密的信息必須使用
私鑰才能解開,反之,用私鑰加密的信息只有使用公鑰才能解開,理論上說,不可能通過公鑰計算獲得密鑰。
信息發送者A通過公開渠道獲得信息接收者B的公鑰,對信息進行加密,然后通過非安全渠道將密文信息發送給消息接收者B,B得到密文后,用自己的
私鑰對信息進行解密,獲得原始的明文信息。即使密文信息在傳輸過程中遭到竊取,竊取者沒有解密密匙也無法還原明文。
再拿上面那個例子,這時候我們還想把一些東西鎖到箱子里給某人,我們稱他為大傻。我們先跟大傻聯系,大傻身上有兩把鑰匙,我們稱為鑰匙A和
鑰匙B。鑰匙A可以用來造鎖,但是造好的鎖自己卻不能開,只能通過鑰匙B來開。跟大傻取得聯系后大傻把鑰匙A給我們。我們拿着鑰匙A找造鎖師傅
造了一把鎖,並且給箱子上鎖。然后將帶鎖的箱子通過物流發給大傻,就算鑰匙A被強盜截取了,強盜也開不了箱子。大傻收到箱子后使用那把鑰匙B
進行開鎖,拿到東西。由於鑰匙B一直再大傻身上,所以不用擔心被人拿走。
因此HTTPS采用混合加密機制
HTTPS為了追求性能,又要保證安全,采用了共享密鑰加密和公開密鑰加密混合的方式進行報文傳輸。
以前感覺這部分有點繞,理解不過來,網上很多帖子都照搬書上的解釋,理解了好久,在這里我把我自己理解寫下來,希望能幫到大家。
我們前面說到共享密鑰加密即對稱加密要解決的一個問題就是如何確保該密鑰安全傳輸到解密方。也就是說如何將鑰匙和鎖一起安全的發送到解鎖人。
而共有密鑰加密即非對稱加密雖然沒有那種困擾,但是細節太多,速度太慢。
還是拿上面的鎖和箱子的例子來說明。現在我們嫌棄每次加鎖都要造個新的鎖效率太慢了。我們現在有兩個箱子,一個箱子用於方我們要給大傻的東西,並且
這個箱子加上了鎖。另一個箱子用於存放那把鎖的鑰匙。我們這時候找大傻拿到鑰匙A造了一把鎖后將那個存放鑰匙的箱子鎖起來,然后將這個箱子給大傻,
大傻拿到箱子使用鑰匙B開鎖拿到鑰匙。這時候我們將那個存放了東西的箱子給大傻,大傻就可以通過這把鑰匙開鎖拿到東西了。這樣以后我們就可以一直通過
這把鎖和箱子互相給東西了,而不用發一次數據造一次鎖了。
就是說采用共有密鑰加密方式傳輸共享密鑰,當共享密鑰安全到達服務端后往后的數據就都采用該密鑰進行加密解密。
但是這里還有一個問題。就是共有密鑰是客戶從服務端獲取的,那我們怎么保證這把共有密鑰真的是從服務端給我們的而不是有人偷梁換柱了呢。
證書
共有密鑰不是服務器隨便產生的,而是服務器的運維人員向數字證書認證機構申請的。
當服務器需要共有密鑰時向運維人員向數字認證機構申請共有密鑰,證書將申請到的密鑰加上數字簽名,然后將加了數字簽名的共有密鑰包裝進公鑰證書。
客戶向服務器要共有密鑰的時候服務器將公鑰證書發送給客戶,客戶取出共有密鑰得到簽名,然后向數字認證機構進行確認,數字認證機構確認該簽名無誤后
客戶可采用該共有密鑰進行加密。