作的:

萬(wàn)碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開(kāi)發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

后來(lái)網(wǎng)景公司開(kāi)發(fā)了SSL(Secure Sockets Layer)技術(shù),然后它就變成了這樣的HTTP,也就是HTTPS了:

萬(wàn)碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開(kāi)發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

后來(lái)爆發(fā)了與IE的世紀(jì)大戰(zhàn),網(wǎng)景敗北,SSL移交給了IETF(Internat Engineering Task Force)互聯(lián)網(wǎng)工程任務(wù)組,標(biāo)準(zhǔn)化之后變成了現(xiàn)在的TLS,現(xiàn)在一般會(huì)把它們兩個(gè)放在一起稱(chēng)為SSL/TLS。本篇并不關(guān)注SSL/TLS具體是如何工作的,只是抽象的解釋下HTTPS的一個(gè)工作流程。

2. HTTPS 工作流程

萬(wàn)碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開(kāi)發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

  1. Client發(fā)起一個(gè)HTTPS(https:/demo.linianhui.dev)的請(qǐng)求,根據(jù)RFC2818的規(guī)定,Client知道需要連接Server的443(默認(rèn))端口。

  2. Server把事先配置好的公鑰證書(shū)public key certificate)返回給客戶(hù)端。

  3. Client驗(yàn)證公鑰證書(shū):比如是否在有效期內(nèi),證書(shū)的用途是不是匹配Client請(qǐng)求的站點(diǎn),是不是在CRL吊銷(xiāo)列表里面,它的上一級(jí)證書(shū)是否有效,這是一個(gè)遞歸的過(guò)程,直到驗(yàn)證到根證書(shū)(操作系統(tǒng)內(nèi)置的Root證書(shū)或者Client內(nèi)置的Root證書(shū))。如果驗(yàn)證通過(guò)則繼續(xù),不通過(guò)則顯示警告信息。

  4. Client使用偽隨機(jī)數(shù)生成器生成加密所使用的會(huì)話(huà)密鑰,然后用證書(shū)的公鑰加密這個(gè)會(huì)話(huà)密鑰,發(fā)給Server。

  5. Server使用自己的私鑰private key)解密這個(gè)消息,得到會(huì)話(huà)密鑰。至此,Client和Server雙方都持有了相同的會(huì)話(huà)密鑰

  6. Server使用會(huì)話(huà)密鑰加密“明文內(nèi)容A”,發(fā)送給Client。

  7. Client使用會(huì)話(huà)密鑰解密響應(yīng)的密文,得到“明文內(nèi)容A”。

  8. Client再次發(fā)起HTTPS的請(qǐng)求,使用會(huì)話(huà)密鑰加密請(qǐng)求的“明文內(nèi)容B”,然后Server使用會(huì)話(huà)密鑰解密密文,得到“明文內(nèi)容B”。

簡(jiǎn)單總結(jié)下,HTTPS是使用了證書(shū)的一個(gè)混合密碼系統(tǒng),其中證書(shū)的作用在于傳遞會(huì)話(huà)密鑰,以及驗(yàn)證網(wǎng)站的真實(shí)性;而HTTPS真正的加密操作是由對(duì)稱(chēng)密碼這個(gè)工具負(fù)責(zé)的(有興趣的可以找找每個(gè)步驟中都用到了密碼工具箱中的那些工具)。在windows系統(tǒng)中,可以配置一個(gè)名為 SSLKEYLOGFILE 的環(huán)境變量,Chrome和Firefox在訪(fǎng)問(wèn)HTTPS站點(diǎn)的時(shí)候,會(huì)把第4步生成的會(huì)話(huà)密鑰以及其他附屬信息,寫(xiě)入到這個(gè)文件中:

萬(wàn)碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開(kāi)發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

比如下圖:

萬(wàn)碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開(kāi)發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

具體的格式可以參考MDN的一個(gè)說(shuō)明https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/Key_Log_Format。

以上只是一個(gè)抽象的HTTPS的一個(gè)工作流程,實(shí)際上SSL/TLS所做的工作遠(yuǎn)不止這這些,更詳細(xì)的解釋請(qǐng)參考這篇文章:http://www.infoq.com/cn/articles/HTTPS-Connection-Jeff-Moser。

如有錯(cuò)誤之處,歡迎指正!

3. 參考

SSL/TLS:https://en.wikipedia.org/wiki/Transport_Layer_Security

IETF:https://en.wikipedia.org/wiki/Internet_Engineering_Task_Force

HTTPS:https://en.wikipedia.org/wiki/HTTPS

HTTPS 連接最初的若干毫秒:http://www.infoq.com/cn/articles/HTTPS-Connection-Jeff-Moser

HTTPS on Stack Overflow: The End of a Long Road:https://nickcraver.com/blog/2017/05/22/https-on-stack-overflow/

SSL/TLS部署最佳實(shí)踐:https://github.com/ssllabs/research/wiki/SSL-and-TLS-Deployment-Best-Practices

HTTP Over TLS:https://tools.ietf.org/html/rfc2818

SSLKEYLOGFILE:https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/Key_Log_Format

作者:Blackheart

出處:http://linianhui.cnblogs.com

本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。

http://www.cnblogs.com/linianhui/p/security-https-workflow.html