HTTPS 加密、證書(shū)、簽名與握手
HTTPS有什么用
如果你對(duì)HTTPS了解不深,可能會(huì)覺(jué)得上了HTTPS就是把 http://變成 https://,然后有把小鎖頭在瀏覽器地址欄上。這看起來(lái)似乎可有可無(wú)。但是我們?cè)谏暾?qǐng) HTTPS 證書(shū)的時(shí)候卻比較麻煩,除了要定時(shí)續(xù)簽之外,有的證書(shū)還需要支付一定的費(fèi)用。那么,我們到底加上 HTTPS 有什么作用呢?我總結(jié)了兩點(diǎn):
加密傳輸數(shù)據(jù),確保客戶端和服務(wù)器之間傳輸?shù)臄?shù)據(jù)不被中間人竊取、篡改。
驗(yàn)證你訪問(wèn)的網(wǎng)站確實(shí)是該網(wǎng)站的控制人所發(fā)布的。
第一點(diǎn)我相信比較好理解,我們電腦連接服務(wù)器的過(guò)程中,可能會(huì)受到很多中間人的監(jiān)控,比如你在學(xué)校上網(wǎng)可能受到學(xué)校網(wǎng)關(guān)的監(jiān)控,你在公共WIFI上網(wǎng)可能被黑客監(jiān)控,你在國(guó)內(nèi)上網(wǎng)可能受到一些眾所周知的監(jiān)控等等,如果你訪問(wèn) HTTP 協(xié)議的網(wǎng)站,那么不好意思,你所看到的所有網(wǎng)站內(nèi)容,你發(fā)給服務(wù)器的密碼,中間人都可以全部看到,甚至還可以篡改。所以,我們需要對(duì)客戶端和服務(wù)端之間的傳輸數(shù)據(jù)進(jìn)行加密,從而使中間人無(wú)法得知傳輸?shù)恼鎸?shí)內(nèi)容。
而第二點(diǎn),是非常重要的,但是很多人可能沒(méi)有意識(shí)到有什么用。當(dāng)我們的 DNS 不可靠的時(shí)候,我們?cè)L問(wèn) http://www.baidu.com 可能會(huì)被錯(cuò)誤指向一個(gè)惡意的IP,里面也是仿照百度的內(nèi)容,但是嵌入了病毒,但是我們完全不知道,還以為是百度自己干的。但是有了 HTTPS ,我們?cè)L問(wèn) https://www.baidu.com ,看到瀏覽器網(wǎng)址欄鎖,那么我們就可以確信,這個(gè)網(wǎng)頁(yè)的所有內(nèi)容,都是域名的控制人,百度公司提供的。

對(duì)于第二點(diǎn),可能你還沒(méi)有直觀的印象,你可以在本地的 hosts 中添加
127.0.0.1 www.baidu.com把百度指向你的本機(jī),然后你啟動(dòng)一個(gè)服務(wù)器軟件,模擬 DNS 被人篡改的情況。現(xiàn)在,訪問(wèn) http://www.baidu.com ,你可以看到百度的內(nèi)容就成功被你篡改了。
但是,你訪問(wèn) https://www.baidu.com ,則發(fā)現(xiàn),你如果不修改系統(tǒng)的設(shè)置,你永遠(yuǎn)也不可能在瀏覽器地址欄中看到那個(gè)小鎖,并且會(huì)提示:不安全,原因很簡(jiǎn)單,你不是 www.baidu.com 域名的控制人。所以 HTTPS 起到驗(yàn)證網(wǎng)站是否是域名控制人所有的作用。

對(duì)于第二點(diǎn),還有一種情況,叫中間人攻擊

而 HTTPS 也可以防止這種情況發(fā)生。
那么,HTTPS 能否識(shí)別惡意網(wǎng)站呢?答案是不能的,惡意網(wǎng)站也可以申請(qǐng) HTTPS,并且有地址欄鎖,所以這個(gè)安全不等于網(wǎng)站本身是安全,只是說(shuō)能確保網(wǎng)站確實(shí)是網(wǎng)站的域名的控制人發(fā)布的,而沒(méi)有被第三方中途篡改、監(jiān)聽(tīng)。如果黑客黑進(jìn)了網(wǎng)站的服務(wù)器,那么這個(gè)時(shí)候 HTTPS 同樣也有小鎖,因?yàn)檫@個(gè)時(shí)候網(wǎng)站仍然是在網(wǎng)站域名的控制人的服務(wù)器上面。
一個(gè)腦洞大開(kāi)的 HTTPS 系統(tǒng)
我們先假設(shè),我們不懂什么密碼學(xué)知識(shí),要實(shí)現(xiàn)上面兩個(gè)功能,腦洞大開(kāi)一下,我們應(yīng)該怎么設(shè)計(jì)呢?
首先,我規(guī)定好一種“加密”的方法,假設(shè)我們的網(wǎng)頁(yè)只有英文,那么就把整個(gè)網(wǎng)頁(yè)的所有的字母都位移 n 位,然后解密的時(shí)候,位移回來(lái)就可以了。

現(xiàn)在,我們還要驗(yàn)證網(wǎng)站的內(nèi)容是否是域名控制人提供的,那么我們還需要:

也許看到這里你已經(jīng)笑(ma)了(ren),因?yàn)槲覍?shí)現(xiàn)的系統(tǒng)根本都在做掩耳盜鈴的把戲。
加密算法和位移量 n 是公開(kāi)傳輸?shù)模敲粗虚g人可以截取,從而解密之后的數(shù)據(jù)
服務(wù)器聲稱他的身份,這個(gè)沒(méi)有任何約束,假冒服務(wù)器也可以聲稱他是 亂碼有限公司
每次訪問(wèn)都要連接第三方鑒定機(jī)構(gòu),訪問(wèn)網(wǎng)站的速度很慢。
真實(shí)的 HTTPS
加密方法和摘要方法
首先,我先介紹 HTTPS 里面用到的加密方法,和 hash 摘要方法,如果你已經(jīng)了解,可以跳過(guò)。
對(duì)稱加密
對(duì)稱加密很好理解,就是只有一個(gè)密碼,你可以用這個(gè)密碼加密一段文本,也可以用這個(gè)密碼解密剛剛加密的文本。比如:
你用 WinRAR 創(chuàng)建一個(gè)帶密碼的加密壓縮包。當(dāng)你下次要把這個(gè)壓縮文件解開(kāi)的時(shí)候,你需要輸入【同樣的】密碼。
常見(jiàn)的對(duì)稱加密算法有 DES
非對(duì)稱加密
非對(duì)稱加密是兩個(gè)密碼,分別叫公鑰和私鑰,非對(duì)稱加密有個(gè)很神奇的特點(diǎn):公鑰加密的,只能用私鑰解密,私鑰加密的,只能用公鑰解密。
我們?cè)?http://web.chacuo.net/netrsakeypair 可以用一種非對(duì)稱加密的算法:RSA,隨機(jī)生成一對(duì)這樣的密鑰:
公鑰:
-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAND5ps7FJHtP6ssE6g1l92FR1cFTDjZ9
JbdLHuRFB5mzKswOj7FpGVHErKA1wHmoxG9qHV70KxIBewYzqOrxWKcCAwEAAQ==
-----END PUBLIC KEY-----私鑰:
-----BEGIN PRIVATE KEY-----
MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEA0PmmzsUke0/qywTq
DWX3YVHVwVMONn0lt0se5EUHmbMqzA6PsWkZUcSsoDXAeajEb2odXvQrEgF7BjOo
6vFYpwIDAQABAkBDIyG7Jk0NLOSy6tZDDbJHWuJApO1ZBiXa2FCJZ8AEWZ2xQJbi
GxatFcIL8lC0kayueRtCNQDXQRnsGslG8bqJAiEA8YkyBzOue03aO+EM/Dfj7JX6
ZGIUEArFg+wbe+iZBF0CIQDdfUrb5BGKveORtl05I6W55p5zlR9kA23mCnZETvHA
0wIgdtEFsjNDPtbiZxhjWeNolOaGYUE6G1YhKa9JKeAW/eUCIDpHKVdKX0M+S46f
iU/rjUOo5rBK4IOUU2pf/lZi30F5AiEAz5v9XcTtk6OuNBOb8fjLhyg3FJ1BJoLT
7OsqePL3Q1g=
-----END PRIVATE KEY-----現(xiàn)在,我們有待加密的文本:
好好學(xué)習(xí),天天向上用公鑰加密的結(jié)果:
UvrUthcLQk5aDFGaKlblMZuIR4goomvrKebRpkUftvpXvjKBLYvJiZiRTiyB2s6Bb5ugNEmnjd21aZboJ2moew==以上的密文只能用私鑰來(lái)解密。
同樣,私鑰加密的密文,只能用公鑰來(lái)解密。
那么,這種加密算法的意義是什么呢?
如果一段密文可以用公鑰解密,證明這段密文是由掌握者私鑰的人加密的,而掌握私鑰的人通常是服務(wù)端。這是驗(yàn)證的功能。
一段文字用公鑰加密后,只有持有私鑰的人才能解密,掌握私鑰的人通常是服務(wù)端。這是加密的功能。
Hash 摘要方法
也稱為消息摘要算法。可以將任意長(zhǎng)度的文本轉(zhuǎn)換為較短的固定長(zhǎng)度的二進(jìn)制值,并且源文本一旦修改,那么它們的 hash 是不一樣的,日常生活中,我們常常碰見(jiàn)的 MD5,SHA1 都是 hash 算法。
我們可以把一個(gè)很長(zhǎng)的的文件,進(jìn)行 hash 算法,他永遠(yuǎn)也只會(huì)輸出固定長(zhǎng)度,這非常節(jié)省空間,又確保了源文件沒(méi)有在傳輸或者復(fù)制的時(shí)候被調(diào)包。
比如,Windows 10 1803 的官方鏡像:cn_windows_10_business_edition_version_1803_updated_aug_2018_x64_dvd_57e5b984.iso 足足有 4.86 GB 大,但是他的 SHA1值只有那么長(zhǎng):
533a5c7a732aefc7025f2128ffe0a4f0e5b0ed46證書(shū)、簽名和第三方機(jī)構(gòu)
首先,HTTPS 要驗(yàn)證,你訪問(wèn)的網(wǎng)站確實(shí)是該網(wǎng)站的控制人所發(fā)布的。
這要用到我們上面提到的非對(duì)稱加密一個(gè)非常核心的功能:驗(yàn)證功能。
博主博客的域名是 luan.ma ,我自己持有私鑰和公鑰(可以直接隨機(jī)生成),我把一串字符(網(wǎng)頁(yè))加密之后,把公鑰和密文發(fā)布給任何人(包括你),任何人通過(guò)這個(gè)公鑰解密,如果能成功解密,并且這個(gè)公鑰確實(shí)是我發(fā)給你的,那么說(shuō)明,這個(gè)密文確實(shí)是我發(fā)出的,而沒(méi)有被中間人調(diào)包,因?yàn)椋澜缰挥形页钟羞@一套配對(duì)的公鑰和私鑰。
那么,關(guān)鍵的問(wèn)題是,如何確定這個(gè)公鑰的是不是真的是我發(fā)出的呢?我們需要一個(gè)第三方機(jī)構(gòu) :數(shù)字證書(shū)管理機(jī)構(gòu) (Certificate Authority )簡(jiǎn)稱 CA 來(lái)證明。
我會(huì)向一個(gè)非常有公信力的 CA 申請(qǐng),把我域名、個(gè)人資料和公鑰提交給CA,CA確認(rèn) luan.ma 域名是我的(通過(guò)DNS驗(yàn)證),并且確認(rèn)我的信息是真實(shí)的。之后,CA會(huì)把 我的信息 和 我的公鑰 制作成一個(gè) 證書(shū),然后用 CA 自己的私鑰加密(CA手里也有一對(duì)公鑰和私鑰),附上CA自己的名字。然后讓我取回CA簽發(fā)的證書(shū)。最大的CA公司是 DigiCert,常見(jiàn)的可以簽發(fā)免費(fèi)證書(shū)的CA有 誠(chéng)信亞洲,let's encrypt 等。
證書(shū)可以公開(kāi)發(fā)布,除了域名、網(wǎng)站主信息、CA名稱外,還有有效期,附加域名(加錢),公司名(加錢)等信息:
下面是百度的證書(shū)的主域名、頒發(fā)的CA、網(wǎng)站主信息、公鑰、可用域名。





那么,這個(gè)證書(shū)被做出來(lái)之后,我再把證書(shū)和他的密文發(fā)給你,你先用CA的公鑰解密證書(shū)(如果證書(shū)不是CA私鑰加密的,無(wú)法用公鑰解密),解密后看到我的公鑰(這個(gè)公鑰是我的這一點(diǎn),由CA公證、擔(dān)保),然后如果我的公鑰可以解密密文,那么就說(shuō)明,這個(gè)密文是我自己發(fā)出來(lái)的,而不是別人。
那么,聰明的你也會(huì)問(wèn)了,CA的公鑰要怎么獲取呢?要不要從CA的網(wǎng)站上面下載呢?我怎么知道CA的公鑰到底是不是CA的呢?這好像變成了雞生蛋,蛋生雞的問(wèn)題,
不過(guò),解決這個(gè)問(wèn)題其實(shí)很簡(jiǎn)單,也很笨,因?yàn)?CA 的個(gè)數(shù)是有限的,所以,只要CA和瀏覽器廠商和操作系統(tǒng)搞好關(guān)系,叫他們把公鑰預(yù)裝在系統(tǒng)或者瀏覽器里面,就沒(méi)有問(wèn)題了。當(dāng)A出示一個(gè)證書(shū)之后,按照證書(shū)上面 CA 的名字,就可以獲取到對(duì)應(yīng)CA的公鑰了。通常,CA的公鑰也在一個(gè)CA自己給自己做的證書(shū)里面,叫做根證書(shū)。所以,這里有個(gè) Bug,根證書(shū)的真實(shí)性由瀏覽器和操作系統(tǒng)擔(dān)保的,如果你的瀏覽器是不可信的(比如某些國(guó)產(chǎn)瀏覽器)或者你從奇怪的網(wǎng)站上面下載了操作系統(tǒng)安裝文件,那么里面的公鑰可能會(huì)被別有用心的人修改,那么你整個(gè)電腦的HTTPS體系就不再可靠了。

這里還有幾個(gè)小問(wèn)題。第一個(gè),證書(shū)的內(nèi)容里面有A的信息和A的公鑰,可能內(nèi)容比較長(zhǎng),如果我們用私鑰加密所有信息,那么整張證書(shū)的體積可能會(huì)變得非常大,在SSL誕生初期的二十多年前,這可能是網(wǎng)絡(luò)不能容忍的。那么,我們要怎么優(yōu)化呢?答案就是,我們對(duì)證書(shū)的正文部分不加密,而是對(duì)正文做一個(gè) Hash 信息摘要,變成一個(gè)很短的字符串,成為指紋,然后只用私鑰加密 Hash 這部分,稱為簽名,放入證書(shū)正文的后面。驗(yàn)證的時(shí)候,用CA的公鑰解密 Hash,然后重新計(jì)算一次正文的 Hash,兩相比對(duì),即可知道證書(shū)的真?zhèn)巍#P(guān)于指紋機(jī)制為什么存在,這只是我個(gè)人的觀點(diǎn))。
圖:百度證書(shū)的Hash指紋的算法是sha256,Hash 指紋是d6aa..


第二個(gè)小問(wèn)題,舊CA的根證書(shū)可能在許多老系統(tǒng)中都已經(jīng)存在了,比如XP電腦。假設(shè)我現(xiàn)在想自己建一個(gè)CA,怎么辦呢?難不成我還得跟這么瀏覽器廠商、系統(tǒng)廠商一個(gè)一個(gè)談判嗎?即使談判成功,那舊電腦和舊瀏覽器也不會(huì)再更新了,難不成我CA做生意還要等到100年后XP全部淘汰才行?有三個(gè)解決辦法:
如果只是在自己的地盤(pán)當(dāng)CA,只需要把你的地盤(pán)的所有電腦都導(dǎo)入這個(gè)CA的根證書(shū)即可(反面教材:12306舊版要求公眾下載自己的CA的根證書(shū),新版已經(jīng)全部換成公認(rèn)CA的)。
如果你要當(dāng)世界都公認(rèn)的CA,并且已經(jīng)和主流瀏覽器和操作系統(tǒng)廠商談判好之后,可以把新證書(shū)通過(guò) OSCP 在線同步到世界各地的電腦中(OSCP也可以用于第一種,在你的地盤(pán)同步)。
如果你沒(méi)有能力完成上面的談判的話,那么最好的方法是找現(xiàn)有的CA公司,花錢當(dāng)小弟,讓CA公司給你簽發(fā)一張二級(jí)根證書(shū)證明你的公鑰可靠,然后你再用你的私鑰給別人簽發(fā)證書(shū)。給別人簽發(fā)證書(shū)的時(shí)候,要把自己的二級(jí)根證書(shū)和用戶證書(shū)做成一張綁定證書(shū)。用戶校驗(yàn)的時(shí)候先通過(guò)系統(tǒng)中的一級(jí)根證書(shū)的公鑰校驗(yàn)二級(jí)根證書(shū)的有效性,再用二級(jí)根證書(shū)的公鑰校驗(yàn)用戶證書(shū)的有效性。這個(gè)稱為證書(shū)鏈機(jī)制。
圖:證書(shū)鏈機(jī)制:Let's Encrypt 是二級(jí) CA

第三個(gè)小問(wèn)題,憑什么他們就能當(dāng)CA,我們就只能當(dāng)小弟呢?CA一般是由有良好信用歷史的公司擔(dān)任,CA最重要的工作,也是底線,就是要驗(yàn)證申請(qǐng)證書(shū)這個(gè)人是不是他本人,或者說(shuō),給這個(gè)網(wǎng)站申請(qǐng)證書(shū)的人,到底是不是這個(gè)網(wǎng)站的域名控制人(這可以通過(guò)DNS添加TXT記錄驗(yàn)證)。如果公認(rèn)CA未經(jīng)域名持有人同意就私自簽發(fā)了某網(wǎng)站的證書(shū),并且被人發(fā)現(xiàn)的話,那后果是非常嚴(yán)重的,會(huì)被瀏覽器或操作系統(tǒng)通過(guò) OSCP 把 該CA 的根證書(shū) 加入 證書(shū)吊銷列表 (Certificate Revocation List ,簡(jiǎn)稱:CRL),那么這個(gè)CA就沒(méi)得玩了,只能認(rèn)個(gè)大哥把自己變成二級(jí)CA,或者停止業(yè)務(wù)。CA烈士墻有:CNNIC,沃通, 賽門(mén)鐵克。另外一方面,如果,如果CA私自簽發(fā)還沒(méi)被發(fā)現(xiàn)的話,這里面也存在著巨大的利益,完全有可能被政府或者別的機(jī)構(gòu)利用。Windows系統(tǒng)有61家CA的根證書(shū)被信任,只要有其中一家 CA 未經(jīng)驗(yàn)證就給黑客簽發(fā)了一個(gè)證書(shū),就可以把中間人由黑的變成白的。
圖:曾經(jīng)的一級(jí)CA沃通,現(xiàn)在淪為二級(jí)CA:

第四個(gè)小問(wèn)題,怎么樣給CA充錢變得更強(qiáng)?大家可以去CA的網(wǎng)站參觀,比如:https://www.trustasia.com/
EV SSL (Extended Validation) (證書(shū):適用于中大型企業(yè)網(wǎng)站,驗(yàn)證域名和公司,地址欄顯示公司名稱。1-5個(gè)工作日完成申請(qǐng),驗(yàn)證域名和公司,地址欄顯示公司名稱。比如CA自己的網(wǎng)站會(huì)用,裝B用,非常貴。
OV SSL (Organization Validation)證書(shū):適用于中小企業(yè)網(wǎng)站,驗(yàn)證域名和公司,證書(shū)內(nèi)顯示公司信息。1-5個(gè)工作日完成申請(qǐng),驗(yàn)證域名和公司,可提高網(wǎng)站可信度。大部分企業(yè)網(wǎng)站會(huì)用,比如百度、Google、QQ等均使用OV證書(shū),比較貴。
DV SSL (Domain Validation) 證書(shū):只驗(yàn)證域名,小網(wǎng)站和個(gè)人網(wǎng)站可用,10分鐘內(nèi)可以通過(guò)。有免費(fèi)的。
還有加域名通配符,加額外域名等加錢套餐。
第五個(gè)小問(wèn)題,證書(shū)有效期最長(zhǎng)可以簽多長(zhǎng)?為什么?2018年3月1日起,所有公開(kāi)信任的SSL證書(shū),最長(zhǎng)有效期縮短為2年(825天),建議網(wǎng)站所有者提前做好相應(yīng)準(zhǔn)備。新規(guī)由國(guó)際標(biāo)準(zhǔn)組織CAB Forum在2017年第193號(hào)投票通過(guò)。縮短有效期的最重要原因是,你的公司可能倒閉了,域名可能過(guò)期了,被接盤(pán)俠注冊(cè)了,但是你還持有這個(gè)域名的證書(shū),這是不合理,也不安全的,所以一般證書(shū)有效期都為一年,而較為寬松的 Let's encrypt 證書(shū)的有效期只有三個(gè)月。
HTTPS連接
講了這么多廢話,現(xiàn)在終于進(jìn)入正題,HTTPS是怎么連接的呢?
加密傳輸這個(gè)問(wèn)題很好解決,因?yàn)槲覀冇辛藢?duì)稱加密算法,只需要服務(wù)端和瀏覽器同時(shí)知道密碼,就可以進(jìn)行穩(wěn)定的加密傳輸了。
現(xiàn)在主要問(wèn)題變成,在第一次連接時(shí),如何在中間人監(jiān)聽(tīng)的情況下,服務(wù)端和瀏覽器協(xié)商出兩個(gè)人都知道,中間人不知道的密碼,并且瀏覽器對(duì)服務(wù)端進(jìn)行身份確認(rèn),這就要用到 非對(duì)稱加密 的算法,用 RSA 或者 DH - RSA 進(jìn)行密鑰協(xié)商,也叫 HTTPS 握手,這是 HTTPS 的重點(diǎn)。
RSA握手
第一步,瀏覽器給出協(xié)議版本號(hào)、一個(gè)客戶端生成的帶時(shí)間戳隨機(jī)數(shù)(Client random),以及一個(gè) seesion-id 本次會(huì)話 id,以及客戶端支持的加密方法。
第二步,服務(wù)器確認(rèn)雙方使用的加密方法,并給出數(shù)字證書(shū)(內(nèi)含公鑰)、以及一個(gè)服務(wù)器生成的帶時(shí)間戳隨機(jī)數(shù)(Server random)。
第三步,瀏覽器確認(rèn)數(shù)字證書(shū)有效(先用電腦的CA的公鑰解密指紋是否有效,見(jiàn)證書(shū)驗(yàn)證過(guò)程),保存服務(wù)器隨機(jī)數(shù)。然后生成一個(gè)新的隨機(jī)數(shù)(Premaster secret),并使用數(shù)字證書(shū)中的公鑰,加密這個(gè)隨機(jī)數(shù),發(fā)給瀏覽器。
第四步,服務(wù)器使用自己的私鑰,解密瀏覽器發(fā)來(lái)的隨機(jī)數(shù)(即Premaster secret)。
第五步,瀏覽器和服務(wù)器根據(jù)約定的加密方法,使用前面的三個(gè)隨機(jī)數(shù),生成"對(duì)話密鑰"(session key),用來(lái)加密接下來(lái)的整個(gè)對(duì)話過(guò)程。(之后用 seesion key 進(jìn)行對(duì)稱機(jī)密)
這里的 Client random 和 Server random 可以防止重放攻擊,即可以防止黑客截取了密文,仿造用戶和數(shù)據(jù)包直接多次發(fā)送給服務(wù)器,服務(wù)器如果沒(méi)有這些隨機(jī)數(shù)驗(yàn)證之前是否已經(jīng)生成過(guò) seesion key,那么很可能被黑客利用。比如說(shuō),仿造用戶多次下單等。


單純RSA有個(gè)致命的問(wèn)題,因?yàn)楣€和私鑰一經(jīng)生成,就一般不會(huì)再修改,如果你的私鑰被泄露,那么我通過(guò)截取你的握手時(shí)候的數(shù)據(jù),就可以得到你的 Seesion Key,從而破解你的加密內(nèi)容。
DH-RSA握手
這種密鑰協(xié)商的方法比上面的 RSA 更安全,步驟如下:
客戶端先連上服務(wù)端,發(fā)送協(xié)議版本號(hào),一個(gè)臨時(shí)帶時(shí)間戳隨機(jī)數(shù) 和 本次會(huì)話 id
服務(wù)端生成一個(gè)隨機(jī)數(shù) s 作為自己的私鑰,然后指定 DH 算法參數(shù) (p, g),并計(jì)算出臨時(shí)公鑰 S= g^s % p
服務(wù)端把證書(shū),發(fā)給瀏覽器
服務(wù)端把 DH 算法的算法參數(shù) (p, g),臨時(shí)公鑰S,服務(wù)器臨時(shí)隨機(jī)數(shù) ,經(jīng)過(guò)摘要簽名后,發(fā)給瀏覽器
瀏覽器驗(yàn)證證書(shū)有效,驗(yàn)證上面的數(shù)據(jù)有效,通過(guò)服務(wù)器的公鑰,提取 DH 算法參數(shù) (p, g) 和 臨時(shí)公鑰 S (防篡改)
瀏覽器生成一個(gè)隨機(jī)數(shù) c 作為自己的私鑰,然后計(jì)算出臨時(shí)公鑰 C = g^c % p
瀏覽器把 C 發(fā)送給服務(wù)端
客戶端和服務(wù)端根據(jù) DH 算法 (S^c % P == C ^ s % P)各自計(jì)算出相同的 seesion-key 作為會(huì)話密鑰
p,q的選擇
p 必須是質(zhì)數(shù)且足夠大(至少300位)
s,c 也要足夠大(至少100位),且必須是隨機(jī)生成。
g 必須是質(zhì)數(shù),【不】需要很大,比如 2 或 3 或 5 都可以。
這樣,即使中間人可以截取任何數(shù)據(jù),但是因?yàn)闊o(wú)法倒推出私鑰(求解“離散對(duì)數(shù)問(wèn)題”難解),無(wú)法求解出最終結(jié)果。從而巧妙的提高了安全性。

一般現(xiàn)實(shí)實(shí)現(xiàn)中,使用的是基于以上算法改進(jìn)的 ECDHE-RSA 算法
斷開(kāi)重連
握手階段用來(lái)建立SSL連接。如果出于某種原因,對(duì)話中斷,就需要重新握手。
每一次對(duì)話都有一個(gè)編號(hào)(session ID)。如果對(duì)話中斷,下次重連的時(shí)候,只要客戶端給出這個(gè)編號(hào),且服務(wù)器有這個(gè)編號(hào)的記錄,雙方就可以重新使用已有的"對(duì)話密鑰",而不必重新生成一把。

TLS1.3 優(yōu)化
TLS1.3 是 HTTPS 的最新版本,他的最終版本已經(jīng)于 2018年 8 月發(fā)布,Chrome 69+ 版本已經(jīng)支持。將在不久進(jìn)入國(guó)際標(biāo)準(zhǔn)。
TLS1.3 優(yōu)化了握手的流程,減少了來(lái)回程的數(shù)量:

TLS1.2版本的握手

TLS1.3版本的握手
可見(jiàn),在分享臨時(shí)公鑰時(shí),瀏覽器在驗(yàn)證服務(wù)端證書(shū)之前,先行發(fā)出了臨時(shí)公鑰。這樣可以縮減一步連接的時(shí)間。
另外,在重連時(shí),也更快了,即,還沒(méi)重連好,就把HTTP頭給帶上了:

來(lái)源:https://www.yuque.com/page/luan.ma/https-introduction#be91su
-------- THE END --------
