HTTPS原理解析

HTTP是什么

超文本傳輸協(xié)議(英文:HyperText Transfer Protocol瘾蛋,縮寫:HTTP)是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議。是一個(gè)基于請求與響應(yīng)模式的秒梳、無狀態(tài)的、應(yīng)用層的協(xié)議箕速,忱业猓基于TCP的連接方式,絕大多數(shù)的Web開發(fā)盐茎,都是構(gòu)建在HTTP協(xié)議之上的Web應(yīng)用兴垦。

為了方便通信就必須統(tǒng)一約定好雙方的數(shù)據(jù)協(xié)議,如果每個(gè)人都搞一套自己的規(guī)則庭呜,這玩起來就很麻煩了滑进。因此IETF (互聯(lián)網(wǎng)工程任務(wù)組) 推動(dòng)了HTTP的統(tǒng)一和發(fā)展。現(xiàn)在大家用得最多的還是1999年收錄于RFC 2616的1.1版本募谎,2015年發(fā)布的2.0版本在推廣道路上任重道遠(yuǎn)扶关。

HTTP[S]報(bào)文

最直觀上的差異,HTTP協(xié)議用明文傳輸報(bào)文数冬,HTTPS用密文节槐。


報(bào)文對比

HTTP的缺陷

  • 竊聽風(fēng)險(xiǎn)(eavesdropping):明文傳輸,第三方可以獲知通信內(nèi)容拐纱。
  • 篡改風(fēng)險(xiǎn)(tampering):第三方可以修改通信內(nèi)容铜异。
  • 冒充風(fēng)險(xiǎn)(pretending):第三方可以冒充他人身份參與通信。

HTTPS是什么

超文本傳輸安全協(xié)議(英語:Hypertext Transfer Protocol Secure秸架,縮寫:HTTPS揍庄,常稱為HTTP over TLS,HTTP over SSL或HTTP Secure)
是一種透過計(jì)算機(jī)網(wǎng)絡(luò)進(jìn)行安全通信的傳輸協(xié)議东抹。HTTPS經(jīng)由HTTP進(jìn)行通信蚂子,但利用SSL/TLS協(xié)議來加解密數(shù)據(jù)包沃测。

HTTPS開發(fā)的主要目的,是提供對網(wǎng)站服務(wù)器的身份認(rèn)證食茎,保護(hù)交換數(shù)據(jù)的隱私與完整性蒂破;
HTTPS并不是一個(gè)單獨(dú)的協(xié)議,而是對工作在一加密連接(TLS/SSL)上的常規(guī)HTTP協(xié)議的稱呼别渔。因此HTTPS被稱之為身披SSL外殼的HTTP附迷。

SSL/TLS協(xié)議

傳輸層安全性協(xié)議(Transport Layer Security,縮寫作 TLS)哎媚,及其前身安全套接層(Secure Sockets Layer喇伯,縮寫作 SSL)是一種安全協(xié)議,目的是為互聯(lián)網(wǎng)通信拨与,提供安全及數(shù)據(jù)完整性保障

發(fā)展歷史

網(wǎng)景公司(Netscape)在1994年推出首版網(wǎng)頁瀏覽器艘刚,網(wǎng)景導(dǎo)航者時(shí),推出HTTPS協(xié)議截珍,以SSL進(jìn)行加密,這是SSL的起源箩朴。后面岗喉,IETF將SSL進(jìn)行標(biāo)準(zhǔn)化,稱為TLS炸庞。在瀏覽器钱床、電子郵件、即時(shí)通信埠居、VoIP查牌、網(wǎng)絡(luò)傳真等應(yīng)用程序中,廣泛支持這個(gè)協(xié)議

協(xié)議 年份 描述
SSL 1.0 N/A 從未公開過滥壕,因?yàn)榇嬖趪?yán)重的安全漏洞
SSL 2.0 1995 因?yàn)榇嬖跀?shù)個(gè)嚴(yán)重的安全漏洞而被3.0版本替代
SSL 3.0 1996 2014年10月Google發(fā)現(xiàn)該版本的嚴(yán)重漏洞纸颜,建議全面禁用SSL版本
TLS 1.0 1999 IETF標(biāo)準(zhǔn)化后的第一個(gè)版本。包括可以降級(jí)到SSL 3.0的實(shí)現(xiàn)绎橘,這削弱了連接的安全性
TLS 1.1 2006 -
TLS 1.2 2008 刪除了對SSL的兼容胁孙。目前使用最廣泛的版本
TLS 1.3 2018 截至本文撰寫,為建議標(biāo)準(zhǔn)的互聯(lián)網(wǎng)草案
在TCP/IP模型的位置:介于傳輸層與應(yīng)用層之間
SSL/TLS在TCP/IP模型的位置
TLS內(nèi)部協(xié)議劃分
TLS協(xié)議棧
  • 記錄協(xié)議:位于TLS握手協(xié)議的下面称鳞,在可靠的傳輸協(xié)議(如TCP/IP)上面涮较。其負(fù)責(zé)識(shí)別不同的消息類型,以及每條消息的完整性冈止、安全性驗(yàn)證
  • 握手協(xié)議:服務(wù)端與客戶端在應(yīng)用程序協(xié)議傳輸之前進(jìn)行相互認(rèn)證狂票,協(xié)商加密算法和加密密鑰

另外還有3個(gè)輔助協(xié)議:

  • 改變加密方式協(xié)議,用來通知對方要切換加解密方案了(有點(diǎn)冗余熙暴,在TLS1.3里面已經(jīng)被刪掉了)
  • 警告協(xié)議闺属,定義了校驗(yàn)及其他出錯(cuò)類型慌盯,
  • 應(yīng)用數(shù)據(jù)協(xié)議, 把http屋剑,smtp等數(shù)據(jù)流傳入記錄層做處理并傳輸润匙。

SSL/TLS解決了什么問題

【內(nèi)容加密】所有信息都是加密傳播,第三方無法竊聽唉匾。(密鑰協(xié)商機(jī)制)
【數(shù)據(jù)完整性】具有校驗(yàn)機(jī)制孕讳,一旦被篡改,通信雙方會(huì)立刻發(fā)現(xiàn)巍膘。(MAC(Message authentication code)校驗(yàn)機(jī)制)
【身份認(rèn)證】配備身份證書厂财,防止身份被冒充(證書認(rèn)證機(jī)制)

SSL的握手過程

以下是使用curl請求https://baidu.com的詳情

foam@cee: ~ ? curl "https://baidu.com" -v                                                                                            
* Rebuilt URL to: https://baidu.com/
*   Trying 123.125.115.110...
* TCP_NODELAY set
* Connected to baidu.com (123.125.115.110) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/cert.pem
  CApath: none
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Client hello (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS change cipher, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
* ALPN, server accepted to use http/1.1
* Server certificate:
*  subject: C=CN; L=Beijing; O=BeiJing Baidu Netcom Science Technology Co., Ltd; OU=service operation department; CN=www.baidu.cn
*  start date: Apr  3 00:00:00 2018 GMT
*  expire date: Apr  3 12:00:00 2019 GMT
*  subjectAltName: host "baidu.com" matched cert's "baidu.com"
*  issuer: C=US; O=DigiCert Inc; CN=DigiCert SHA2 Secure Server CA
*  SSL certificate verify ok.
> GET / HTTP/1.1
...
< HTTP/1.1 302 Moved Temporarily
...

我們分析下其中TLS1.2握手的過程:

  1. TLS handshake, Client Hello【客戶端向服務(wù)端問好】
    客戶端通過發(fā)送Client Hello報(bào)文開始建立SSL通信,報(bào)文包含客戶端支持的SSL版本峡懈,加密套件列表璃饱,隨機(jī)數(shù)。上面例子中肪康,ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH就是客戶端支持的加密套件的表達(dá)式荚恶。

  2. TLS handshake, Server Hello【服務(wù)端回禮】
    服務(wù)端回復(fù)Server Hello作為應(yīng)答,報(bào)文包含服務(wù)端選擇好的SSL版本磷支,加密套件谒撼,隨機(jī)數(shù)。上面例子中雾狈,服務(wù)端選擇了TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256廓潜。

  3. TLS handshake, Certificate【服務(wù)端亮出身份】
    服務(wù)端發(fā)送證書鏈(從根證書到自身的證書)。證書包含證書所有者善榛、頒發(fā)機(jī)構(gòu)以及公鑰辩蛋、數(shù)字簽名等信息。
    客戶端收到證書后移盆,會(huì)校驗(yàn)域名悼院;判斷有效時(shí)間;判斷頒發(fā)機(jī)構(gòu)是否可信任咒循;用頒發(fā)機(jī)構(gòu)的公鑰解開加密后的數(shù)字簽名(解開后得到證書摘要和摘要算法)樱蛤,計(jì)算并判斷證書摘要是否一致。
    如果校驗(yàn)過程中出現(xiàn)問題剑鞍,客戶端將報(bào)Alert警告昨凡,并終止SSL握手。當(dāng)然蚁署,如果警告級(jí)別只是warning(還有一種是fatal)便脊,那么客戶端也可以選擇忽略警告并繼續(xù)完成握手過程。

  4. TLS handshake, Server key exchange【服務(wù)端將密鑰生成參數(shù)及方法告知客戶端】
    對于使用DHE/ECDHE非對稱密鑰協(xié)商算法的光戈,會(huì)有該次握手(RSA哪痰、DH遂赠、ECDH則沒有)。
    以ECDHE為例晌杰,服務(wù)端隨機(jī)生成隨機(jī)值Rb跷睦,計(jì)算Pb(x,y) = Rb * Q(x, y)。然后將Pb(x, y)發(fā)送給客戶端肋演,用來在后續(xù)步驟中計(jì)算出PreMasterSecret抑诸。ps:該條消息包含一個(gè)用服務(wù)端私鑰作的簽名。

  5. TLS handshake, Server finished【服務(wù)端提醒:關(guān)于密鑰生成爹殊,該說的我都說完了】
    服務(wù)器發(fā)送這條消息表明蜕乡,服務(wù)器部分的密鑰交換信息已經(jīng)發(fā)送完了,等待客戶端的消息以繼續(xù)接下來的步驟梗夸。這條消息只用作提醒层玲,不包含數(shù)據(jù)域。

  6. TLS handshake, Client key exchange【客戶端將密鑰生成參數(shù)及方法告知服務(wù)端】
    這條消息會(huì)把PreMasterSecret或者生成PreMasterSecret的數(shù)據(jù)發(fā)給服務(wù)端反症。
    具體是哪種數(shù)據(jù)與所選用的密鑰交換算法有關(guān):

  • RSA:數(shù)據(jù)為用服務(wù)器RSA公鑰加密過的PreMasterSecret
  • ECDHE:客戶端隨機(jī)生成隨機(jī)值Ra辛块,計(jì)算Pa(x, y) = Ra * Q(x, y)。然后將Pa(x, y)發(fā)給服務(wù)端铅碍『┙担客戶端計(jì)算Sa(x, y) = Ra * Pb(x, y);服務(wù)器計(jì)算Sb(x, y) = Rb *Pa(x, y)该酗;算法保證了Sa = Sb = S,提取其中的S的x向量作為PreMasterSecret
    ps: 此次握手過后士嚎,雙方都拿到了可以計(jì)算出MasterSecret的PreMasterSecret呜魄。
PRF( secret , label , seed )
master_secret = PRF(pre_master_secret, "master secret", ClientHello.random + ServerHello.random) [0..47];
  1. TLS change cipher, Client hello【客戶端:接下來我要用新的加密方式與你交流啦】
    客戶端發(fā)送更改加密方式信號(hào)。本流程不攜帶任何數(shù)據(jù)莱衩,也不參與最后的哈希完整性計(jì)算爵嗅。只是一個(gè)宣告信道開始的流程。TLS1.3將其移除笨蚁。

  2. TLS handshake, Finished【客戶端:我對握手全過程計(jì)算了哈希睹晒,你驗(yàn)證下】
    客戶端發(fā)送,用協(xié)商好的對稱加密密鑰(MasterSecret)加密過的握手?jǐn)?shù)據(jù)包括细。該數(shù)據(jù)包完整地計(jì)算了從握手開始到結(jié)束的所有內(nèi)容的哈希值伪很,保證了整個(gè)握手過程中,數(shù)據(jù)沒有被篡改奋单。服務(wù)端會(huì)去做校驗(yàn)锉试。
    ps: 這條是整個(gè)SSL握手過程中,首次使用對稱性加密的數(shù)據(jù)览濒。

  3. TLS change cipher, Client hello【服務(wù)端:接下來我也要用新的加密方式與你交流啦】
    服務(wù)端發(fā)送更改加密方式信號(hào)呆盖。TLS1.3將其移除拖云。

  4. TLS handshake, Finished【服務(wù)端:我也對握手全過程計(jì)算了哈希,你也驗(yàn)證下】
    服務(wù)端發(fā)送应又,用協(xié)商好的對稱加密密鑰加密過的握手?jǐn)?shù)據(jù)包宙项。客戶端也會(huì)去做校驗(yàn)株扛。

握手終于結(jié)束啦尤筐,接下來的http數(shù)據(jù)傳輸將全部用辛辛苦苦協(xié)商好的MasterSecret進(jìn)行對稱加密。

TLS1.3減少了握手期間的RTT(來回通信延遲)

TLS1.2與1.3握手對比

擴(kuò)展

密碼學(xué)套件的標(biāo)準(zhǔn)名字

TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256為例:

  • TLS代表的是TLS協(xié)議
  • WITH是一個(gè)分隔單詞席里,前面的ECDHE_RSA是握手過程所使用的非對稱加密方法叔磷,后面的AES_128_GCM_SHA256是加密信道的對稱加密方法和用于數(shù)據(jù)完整性檢查的哈希方法
  • ECDHE_RSA,客戶端與服務(wù)端之間在握手期間奖磁,密鑰交換信息使用的非對稱加密算法是第一個(gè)算法改基,證書認(rèn)證時(shí)使用的非對稱加密算法是第二個(gè)。有的證書套件咖为,例如TLS_RSA_WITH_AES_256_CBC_SHA秕狰,WITH單詞前面只有一個(gè)RSA單詞,這時(shí)就表示密鑰交換算法和證書算法都是使用的RSA躁染,所以只指定一次即可鸣哀。可選的主要的密鑰交換算法包括: RSA, DH, ECDH, ECDHE吞彤∥页模可選的主要的證書算法包括:RSA, DSA, ECDSA。兩者可以獨(dú)立選擇饰恕,并不沖突挠羔。
  • AES_128_GCM,指的是AES這種對稱加密算法的128位算法的GCM模式
  • SHA256埋嵌,計(jì)算消息完整性的哈希算法破加。
Charles等代理程序是怎么實(shí)現(xiàn)解析https的

本質(zhì)是中間人。代理程序處在客戶端與服務(wù)端之間雹嗦,服務(wù)端下發(fā)證書的時(shí)候范舀,代理程序copy一份數(shù)據(jù),并將公鑰信息換成自己的了罪,最后用自己的根證書簽名锭环。
最最重要的一步是,將自己的根證書加入到系統(tǒng)信任證書列表里邊泊藕。沒有內(nèi)鬼是破解不了HTTPS的田藐。

image.png

參考資料

HTTPS的二三事
圖解HTTP之HTTPS詳解
HTTPS協(xié)議詳解(四):TLS/SSL握手過程
沃通
維基百科
阮一峰博客
TLS的密碼學(xué)套件
深度解讀SSL/TLS實(shí)現(xiàn)
Master secret的生成
ECC證書和RSA證書
TLS1.3/QUIC 是怎樣做到 0-RTT 的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子汽久,更是在濱河造成了極大的恐慌鹤竭,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件景醇,死亡現(xiàn)場離奇詭異臀稚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)三痰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門吧寺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人散劫,你說我怎么就攤上這事稚机。” “怎么了获搏?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵赖条,是天一觀的道長。 經(jīng)常有香客問我常熙,道長纬乍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任裸卫,我火速辦了婚禮仿贬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘墓贿。我一直安慰自己茧泪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布聋袋。 她就那樣靜靜地躺著队伟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪舱馅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天刀荒,我揣著相機(jī)與錄音代嗤,去河邊找鬼。 笑死缠借,一個(gè)胖子當(dāng)著我的面吹牛干毅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播泼返,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼硝逢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起渠鸽,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤叫乌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后徽缚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體憨奸,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年凿试,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了排宰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡那婉,死狀恐怖板甘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情详炬,我是刑警寧澤盐类,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站痕寓,受9級(jí)特大地震影響傲醉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜呻率,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一硬毕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧礼仗,春花似錦吐咳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至单旁,卻和暖如春沪羔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背象浑。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國打工蔫饰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人愉豺。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓篓吁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蚪拦。 傳聞我的和親對象是個(gè)殘疾皇子杖剪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 原文鏈接:http://blog.jobbole.com/86660/ 1 前言 百度已經(jīng)于近日上線了全站 HTT...
    xlhzj閱讀 1,102評(píng)論 0 2
  • 一冻押、前言 在說HTTPS之前先說說什么是HTTP,HTTP就是我們平時(shí)瀏覽網(wǎng)頁時(shí)候使用的一種協(xié)議盛嘿。HTTP協(xié)議傳輸...
    VincentHK閱讀 375評(píng)論 0 2
  • 原文地址 http://blog.csdn.net/u012409247/article/details/4985...
    0fbf551ff6fb閱讀 3,522評(píng)論 0 13
  • 目錄 一洛巢、https概述 1. 什么是HTTP? 2. 什么是HTTPS孩擂? 3. SSL/TLS...
    出走的流星閱讀 12,827評(píng)論 4 27
  • 夜色煮亮了蛋蛋 風(fēng)狼渊,挲著窗外的青紗 也一樣,透過紗窗撫慰著 我的肌膚类垦,躺在床上思維發(fā)著汗 勞累狈邑,翻一下身。聽蛐蛐秋...
    2b4c67af34a7閱讀 157評(píng)論 4 4