瀏覽器朽合、HTTP俱两、SSL、HTTPS執(zhí)行流程
當(dāng)在瀏覽器中輸入U(xiǎn)RL后曹步,頁(yè)面加載完成的過(guò)程中都發(fā)生了什么事情
1宪彩、解析URL
- 判斷URL是否是合法的URL,如果URL不合法讲婚,則調(diào)用默認(rèn)的搜索引擎尿孔,直接把輸入的內(nèi)容作為要搜索的內(nèi)容進(jìn)行搜索,如果URL合法筹麸,則繼續(xù)下一步活合。
- 檢查這些請(qǐng)求是HTTPS還是HTTP,如果是HTTPS的話則使用HTTPS協(xié)議進(jìn)行訪問(wèn)物赶,否則使用HTTP協(xié)議發(fā)送白指。有些情況下,第一個(gè)請(qǐng)求不是HTTPS的酵紫,但是當(dāng)瀏覽器向網(wǎng)站發(fā)出第一個(gè)HTTP請(qǐng)求之后告嘲,網(wǎng)站會(huì)返回瀏覽器一個(gè)響應(yīng),請(qǐng)求瀏覽器使用HTTPS發(fā)送請(qǐng)求奖地。
- 將URL進(jìn)行字符轉(zhuǎn)換
2橄唬、查找IP地址
- 先檢查瀏覽器的緩存,看看所要訪問(wèn)的域名是否存在于緩存之中参歹,如果存在仰楚,則直接使用緩存中的IP地址進(jìn)行訪問(wèn),如果不存在犬庇,執(zhí)行下一步
- 緩存中沒(méi)有找到僧界,則調(diào)用系統(tǒng)的gethostbyname庫(kù)函數(shù),進(jìn)行查詢械筛,gethostbyname函數(shù)會(huì)先檢查域名是否在本地的Hosts文件中捎泻,如果找到直接返回域名對(duì)應(yīng)的IP飒炎,(這也當(dāng)訪問(wèn)不到某網(wǎng)址時(shí)埋哟,修改hosts文件的原因)如果沒(méi)有找到則執(zhí)行下一步
- 向DNS服務(wù)器發(fā)送一個(gè)域名查詢請(qǐng)求,然后就執(zhí)行DNS查詢過(guò)程郎汪,這個(gè)過(guò)程一般情況下會(huì)返回所要訪問(wèn)域名對(duì)應(yīng)的IP地址赤赊,除非域名真的不存在,或者DNS服務(wù)器出現(xiàn)故障煞赢。
3抛计、建立連接
當(dāng)瀏覽器得到了目標(biāo)服務(wù)器的 IP 地址,以及 URL 中給出來(lái)端口號(hào)(http 協(xié)議默認(rèn)端口號(hào)是 80照筑, https 默認(rèn)端口號(hào)是 443)吹截,它會(huì)調(diào)用系統(tǒng)庫(kù)函數(shù) socket 瘦陈,請(qǐng)求一個(gè) TCP流套接字。進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)的傳輸波俄。
連接建立之后晨逝,則根據(jù)HTTP協(xié)議進(jìn)行數(shù)據(jù)交換,資源通常是 HTML 文件懦铺,也可能是 PDF捉貌,圖片,或者其他類型的內(nèi)容冬念。
4趁窃、頁(yè)面渲染
- 瀏覽器獲得資源文件后,HTML急前,css醒陆,js等文件則根據(jù)自身內(nèi)核的機(jī)制,進(jìn)行頁(yè)面渲染裆针,然后呈現(xiàn)給用戶统求。
參考資料
當(dāng)···時(shí)發(fā)生了什么?
從輸入 URL 到頁(yè)面加載完成的過(guò)程中都發(fā)生了什么事情据块?
在瀏覽器地址欄輸入一個(gè)URL后回車码邻,背后會(huì)進(jìn)行哪些技術(shù)步驟?
SSL
SSL協(xié)議
1另假、背景
- 背景就不多做介紹了像屋,想要了解的可以查看參考文獻(xiàn)。
2边篮、協(xié)議的執(zhí)行過(guò)程 (握手)
SSL握手過(guò)程可以分為三種:
- 只驗(yàn)證服務(wù)器的SSL握手過(guò)程
- 驗(yàn)證服務(wù)器和客戶端的SSL握手過(guò)程
- 恢復(fù)原有會(huì)話的SSL握手過(guò)程
這三種過(guò)程在文獻(xiàn)一SSL身份認(rèn)證原理中都有所介紹己莺,可以跳轉(zhuǎn)去查看,這里我們以第一種握手過(guò)程著重介紹一下戈轿。
只驗(yàn)證服務(wù)器的SSL握手過(guò)程
借用文獻(xiàn)二圖解SSL/TLS協(xié)議中的一張圖
假定客戶端叫做愛(ài)麗絲凌受,服務(wù)器叫做鮑勃,其驗(yàn)證步驟為:
- 愛(ài)麗絲(瀏覽器)給出協(xié)議版本號(hào)思杯、一個(gè)客戶端生成的隨機(jī)數(shù)(隨機(jī)數(shù)A)胜蛉,以及客戶端支持的加密方法。
- 鮑勃(服務(wù)器)確認(rèn)雙方使用的加密方法色乾,并給出數(shù)字證書(shū)誊册、以及一個(gè)服務(wù)器生成的隨機(jī)數(shù)(隨機(jī)數(shù)B)。
- 愛(ài)麗絲(瀏覽器)確認(rèn)數(shù)字證書(shū)有效暖璧,然后生成一個(gè)新的隨機(jī)數(shù)(隨機(jī)數(shù)C)案怯,并使用數(shù)字證書(shū)中的公鑰,加密這個(gè)隨機(jī)數(shù)澎办,發(fā)給鮑勃(服務(wù)器)嘲碱。
- 鮑勃(服務(wù)器)使用自己的私鑰金砍,獲取愛(ài)麗絲(瀏覽器)發(fā)來(lái)的隨機(jī)數(shù)(隨機(jī)數(shù)C)
- 愛(ài)麗絲(瀏覽器)和鮑勃(服務(wù)器)根據(jù)約定的加密方法,使用前面的三個(gè)隨機(jī)數(shù)(A,B,C)麦锯,生成"對(duì)話密鑰"(session key)捞魁,用來(lái)加密接下來(lái)的整個(gè)對(duì)話過(guò)程。
我們可以發(fā)現(xiàn)离咐,在握手的開(kāi)始結(jié)果谱俭,雙方使用的RSA非對(duì)稱加密方式,而握手完成之后宵蛀,兩者的通信則是使用對(duì)稱加密方式昆著。為什么呢,當(dāng)然是為了效率术陶,非對(duì)稱加密安全凑懂,但是所耗資源大;對(duì)稱加密簡(jiǎn)單梧宫,效率比較高接谨。
這樣也許還不夠清晰,下面我們來(lái)抓包看一下:
再盜用一張圖:
-
SSL客戶端通過(guò)Client Hello消息將它支持的SSL版本塘匣、加密算法脓豪、密鑰交換算法、MAC算法等信息發(fā)送給SSL服務(wù)器忌卤。
如圖:
SSL版本 TLS 1.2
Random 隨機(jī)數(shù)A
Cipher suites 支持的加密算法列表 -
SSL服務(wù)器發(fā)送 Server Hello 消息確定本次通信采用的SSL版本扫夜,,隨機(jī)數(shù)B驰徊,服務(wù)器證書(shū)和加密套件笤闯,如果SSL服務(wù)器允許SSL客戶端在以后的通信中重用本次會(huì)話,則SSL服務(wù)器會(huì)為本次會(huì)話分配會(huì)話ID棍厂,并通過(guò)Server Hello消息發(fā)送給SSL客戶端颗味。抓包顯示此次會(huì)話,占用了三個(gè)數(shù)據(jù)包牺弹。
如圖:
Version: TLS 1.2 確認(rèn)使用的協(xié)議版本
Random 隨機(jī)數(shù)B
Session ID Length:0 不重用此次會(huì)話浦马,不分配會(huì)話ID
Cipher Suite 確認(rèn)使用的加密算法
HandShake Protocol:Certificate 提供服務(wù)器證書(shū)
HandShake Protocol:Server Key Exchange 發(fā)送服務(wù)器使用的DH參數(shù)
HandShake Protocol:Server Hello Done server hello結(jié)束 -
SSL客戶端驗(yàn)證SSL服務(wù)器的證書(shū)合法后,利用證書(shū)中的公鑰加密SSL客戶端隨機(jī)生成的隨機(jī)數(shù)C例驹,并通過(guò)Client Key Exchange消息發(fā)送給SSL服務(wù)器捐韩,并發(fā)送Change Cipher Spec消息退唠,通知SSL服務(wù)器后續(xù)報(bào)文將采用協(xié)商好的密鑰和加密套件進(jìn)行加密和MAC計(jì)算
如圖:
HandShake Protocol:Client Key Exchange 發(fā)送瀏覽器使用的DH參數(shù)
HandShake Protocol:Change Cipher Spec 發(fā)送Change Cipher Spec消息鹃锈,通知服務(wù)器開(kāi)始使用加密方式發(fā)送報(bào)文 -
服務(wù)器端發(fā)送change_cipher_spec和finished消息,通知瀏覽器握手結(jié)束瞧预,使用加密通話
如圖:
HandShake Protocol:Change Cipher Spec 發(fā)送Change Cipher Spec消息屎债,通知瀏覽器開(kāi)始使用加密方式發(fā)送報(bào)文,結(jié)束握手
參考文獻(xiàn)
SSL身份認(rèn)證原理
圖解SSL/TLS協(xié)議
數(shù)字證書(shū)原理
使用wireshark觀察SSL/TLS握手過(guò)程--雙向認(rèn)證/單向認(rèn)證
OpenSSL 與 SSL 數(shù)字證書(shū)概念貼
證書(shū)
采用HTTPS協(xié)議的服務(wù)器必須要有一套數(shù)字證書(shū)仅政,可以自己制作,也可以向組織申請(qǐng)(CA證書(shū))盆驹。區(qū)別就是自己頒發(fā)的證書(shū)(自建證書(shū))需要客戶端驗(yàn)證通過(guò)圆丹,才可以繼續(xù)訪問(wèn),而使用受信任的公司申請(qǐng)的證書(shū)則不會(huì)彈出提示頁(yè)面躯喇。
CA證書(shū)
CA 機(jī)構(gòu)辫封,又稱為證書(shū)認(rèn)證中心 (Certificate Authority) 中心,是一個(gè)負(fù)責(zé)發(fā)放和管理數(shù)字證書(shū)的第三方權(quán)威機(jī)構(gòu)廉丽,它負(fù)責(zé)管理PKI結(jié)構(gòu)下的所有用戶(包括各種應(yīng)用程序)的證書(shū)倦微,把用戶的公鑰和用戶的其他信息捆綁在一起,在網(wǎng)上驗(yàn)證用戶的身份正压。CA機(jī)構(gòu)的數(shù)字簽名使得攻擊者不能偽造和篡改證書(shū)欣福。
證書(shū)里包含了什么?
一個(gè)標(biāo)準(zhǔn)的X.509數(shù)字證書(shū)包含以下一些內(nèi)容:
- 證書(shū)的版本信息焦履;
- 證書(shū)的序列號(hào)拓劝,每個(gè)證書(shū)都有一個(gè)唯一的證書(shū)序列號(hào);
- 證書(shū)所使用的簽名算法嘉裤;
- 證書(shū)的發(fā)行機(jī)構(gòu)名稱郑临,命名規(guī)則一般采用X.500格式;
- 證書(shū)的有效期屑宠,現(xiàn)在通用的證書(shū)一般采用UTC時(shí)間格式牧抵,它的計(jì)時(shí)范圍為1950-2049;
- 證書(shū)所有人的名稱,命名規(guī)則一般采用X.500格式侨把;
- 證書(shū)所有人的公開(kāi)密鑰犀变;
- 證書(shū)發(fā)行者對(duì)證書(shū)的簽名。
當(dāng)我們?cè)L問(wèn)一個(gè)支持HTTPS的網(wǎng)站時(shí)秋柄,其認(rèn)證過(guò)成為:
1获枝、網(wǎng)站運(yùn)行者向向一個(gè)證書(shū)發(fā)布機(jī)構(gòu)"SecureTrust CA"為我們自己的公司"ABC Company"申請(qǐng)了一張證書(shū),注意骇笔,這個(gè)證書(shū)發(fā)布機(jī)構(gòu)"SecureTrust CA"是一個(gè)大家公認(rèn)并被一些權(quán)威機(jī)構(gòu)接受的證書(shū)發(fā)布機(jī)構(gòu)省店,一般情況下,我們的操作系統(tǒng)里面已經(jīng)安裝了"SecureTrust CA"的證書(shū)笨触。
2懦傍、運(yùn)維將證書(shū)部署至網(wǎng)站服務(wù)器
3、客戶端向服務(wù)器發(fā)送通信請(qǐng)求
4芦劣、服務(wù)器將自己申請(qǐng)的證書(shū)發(fā)送給客戶端
5粗俱、客戶端拿到服務(wù)器傳過(guò)來(lái)的證書(shū)后,就開(kāi)始驗(yàn)證證書(shū)有效性的過(guò)程虚吟。
- 首先應(yīng)用程序(瀏覽器)讀取證書(shū)中的Issuer(發(fā)布機(jī)構(gòu))為"SecureTrust CA" 寸认,然后會(huì)在操作系統(tǒng)中受信任的發(fā)布機(jī)構(gòu)的證書(shū)中去找"SecureTrust CA"的證書(shū)签财,如果找不到,那說(shuō)明證書(shū)的發(fā)布機(jī)構(gòu)是個(gè)水貨發(fā)布機(jī)構(gòu)偏塞,證書(shū)可能有問(wèn)題唱蒸,程序會(huì)給出一個(gè)錯(cuò)誤信息。
- 如果在系統(tǒng)中找到了"SecureTrust CA"的證書(shū)灸叼,那么應(yīng)用程序就會(huì)從證書(shū)中取出"SecureTrust CA"的公鑰神汹,然后對(duì)我們"ABC Company"公司的證書(shū)里面的指紋和指紋算法用這個(gè)公鑰進(jìn)行解密,
- 然后使用這個(gè)指紋算法計(jì)算"ABC Company"證書(shū)的指紋古今,將這個(gè)計(jì)算的指紋與放在證書(shū)中的指紋對(duì)比慎冤,如果一致,說(shuō)明"ABC Company"的證書(shū)肯定沒(méi)有被修改過(guò)并且證書(shū)是"SecureTrust CA" 發(fā)布的沧卢,證書(shū)中的公鑰肯定是"ABC Company"的蚁堤。
- 對(duì)方然后就可以放心的使用這個(gè)公鑰和我們"ABC Company"進(jìn)行通信了。
以上過(guò)程也就包含了SSL的握手過(guò)程但狭。 - 之后的通信就使用協(xié)商好的秘鑰進(jìn)行加密通信披诗。
自建證書(shū)
申請(qǐng)CA證書(shū),需要不菲的費(fèi)用立磁,我們也可以自己制作一個(gè)證書(shū)呈队,證書(shū)的內(nèi)容和CA差不多,即自建證書(shū)唱歧。
自建證書(shū)的過(guò)程就不多介紹了宪摧,我們只說(shuō)流程。
使用自建證書(shū)的認(rèn)證過(guò)程與CA證書(shū)的認(rèn)證過(guò)程相比颅崩,自建證書(shū)首先需要把服務(wù)器證書(shū)安裝至客戶端中几于。待客戶端收到服務(wù)器發(fā)送過(guò)來(lái)的證書(shū)信息時(shí),就使用這個(gè)證書(shū)校驗(yàn)服務(wù)的合法性沿后。如果校驗(yàn)成功沿彭,則進(jìn)行下一步,如果失敗尖滚,斷開(kāi)連接喉刘。
此致