前言
大家都知道,蘋(píng)果在2016年WWDC上宣布了關(guān)于應(yīng)用需要強(qiáng)制使用HTTPS
的規(guī)定。這也算是個(gè)好消息吧,雖然開(kāi)發(fā)者們可能需要適配下HTTPS
,但是我們的應(yīng)用可算是披上一個(gè)安全的保護(hù)罩了区拳。本篇文章就算是筆者在學(xué)習(xí)HTTPS
過(guò)程中的一個(gè)記錄吧。
HTTPS加密過(guò)程
最近重新了解了下HTTP
和HTTPS
: 首先二者都是網(wǎng)絡(luò)傳輸協(xié)議;HTTPS
在傳輸過(guò)程中是可以通過(guò)加密來(lái)保護(hù)數(shù)據(jù)安全的意乓,以免用戶(hù)敏感信息被第三方獲取樱调。 可以說(shuō)HTTPS
是HTTP
的升級(jí)版、安全版届良。下面我們就簡(jiǎn)單看下HTTPS的加密過(guò)程笆凌,先看下圖。
- 客戶(hù)端發(fā)起
HTTPS
請(qǐng)求
這個(gè)沒(méi)什么好說(shuō)的士葫,就是用戶(hù)在瀏覽器里輸入一個(gè)HTTPS
網(wǎng)址乞而,然后連接到服務(wù)端的443端口。 - 服務(wù)端的配置
采用HTTPS
協(xié)議的服務(wù)器必須要有一套數(shù)字證書(shū)慢显,可以自己制作爪模,也可以向組織申請(qǐng)。區(qū)別就是自己頒發(fā)的證書(shū)需要客戶(hù)端驗(yàn)證通過(guò)荚藻,才可以繼續(xù)訪(fǎng)問(wèn)屋灌,而使用受信任的公司申請(qǐng)的證書(shū)則不會(huì)彈出提示頁(yè)面。這套證書(shū)其實(shí)就是一對(duì)公鑰和私鑰应狱。如果對(duì)公鑰不太理解共郭,可以想象成一把鑰匙和一個(gè)鎖頭,只是世界上只有你一個(gè)人有這把鑰匙疾呻,你可以把鎖頭給別人除嘹,別人可以用這個(gè)鎖把重要的東西鎖起來(lái),然后發(fā)給你岸蜗,因?yàn)橹挥心阋粋€(gè)人有這把鑰匙憾赁,所以只有你才能看到被這把鎖鎖起來(lái)的東西。 - 傳送證書(shū)
這個(gè)證書(shū)其實(shí)就是公鑰散吵,只是包含了很多信息,如證書(shū)的頒發(fā)機(jī)構(gòu),過(guò)期時(shí)間等等矾睦。 - 客戶(hù)端解析證書(shū)
這部分工作是由客戶(hù)端的SSL/TLS來(lái)完成的晦款,首先會(huì)驗(yàn)證公鑰是否有效,比如頒發(fā)機(jī)構(gòu)枚冗,過(guò)期時(shí)間等等缓溅,如果發(fā)現(xiàn)異常,則會(huì)彈出一個(gè)警示框赁温,提示證書(shū)存在的問(wèn)題坛怪。如果證書(shū)沒(méi)有問(wèn)題,那么就生成一個(gè)隨機(jī)值股囊。然后用證書(shū)(也就是公鑰)對(duì)這個(gè)隨機(jī)值進(jìn)行加密袜匿。就好像上面說(shuō)的,把隨機(jī)值用鎖頭鎖起來(lái)稚疹,這樣除非有鑰匙居灯,不然看不到被鎖住的內(nèi)容。 - 傳送加密信息
這部分傳送的是用證書(shū)加密后的隨機(jī)值内狗,目的是讓服務(wù)端得到這個(gè)隨機(jī)值怪嫌,以后客戶(hù)端和服務(wù)端的通信就可以通過(guò)這個(gè)隨機(jī)值來(lái)進(jìn)行加密解密了。 - 服務(wù)端解密信息
服務(wù)端用私鑰解密后柳沙,得到了客戶(hù)端傳過(guò)來(lái)的隨機(jī)值岩灭,然后把內(nèi)容通過(guò)該隨機(jī)值進(jìn)行對(duì)稱(chēng)加密,將信息和私鑰通過(guò)某種算法混合在一起赂鲤,這樣除非知道私鑰噪径,不然無(wú)法獲取內(nèi)容,而正好客戶(hù)端和服務(wù)端都知道這個(gè)私鑰蛤袒,所以只要加密算法夠彪悍熄云,私鑰夠復(fù)雜,數(shù)據(jù)就夠安全妙真。 - 傳輸加密后的信息
這部分信息就是服務(wù)端用私鑰加密后的信息缴允,可以在客戶(hù)端用隨機(jī)值解密還原。 - 客戶(hù)端解密信息
客戶(hù)端用之前生產(chǎn)的私鑰解密服務(wù)端傳過(guò)來(lái)的信息珍德,于是獲取了解密后的內(nèi)容练般。整個(gè)過(guò)程第三方即使監(jiān)聽(tīng)到了數(shù)據(jù),也束手無(wú)策锈候。
到了這里薄料,HTTPS
的整個(gè)加密過(guò)程也就差不多完成了,但是這個(gè)過(guò)程中是不是還有些概念還是不太清楚泵琳,比如SSL
是什么摄职,TLS
又是什么誊役,他們是怎么驗(yàn)證我們的證書(shū)是否有效的呢,它們的驗(yàn)證策略又是怎樣的呢谷市。別急蛔垢,下面我們就討論下TLS
。
TLS
剛開(kāi)始聽(tīng)到TLS
的時(shí)候迫悠,你可能還不太熟悉鹏漆,但是說(shuō)起SSL
你可能就覺(jué)得好耳熟了。其實(shí)TLS
就是從SSL
發(fā)展而來(lái)的创泄,只是SSL
發(fā)展到3.0版本后改成了TLS
艺玲。
TLS
主要提供三個(gè)基本服務(wù)
- 加密
- 身份驗(yàn)證,也可以叫證書(shū)驗(yàn)證吧~
- 消息完整性校驗(yàn)
第三個(gè)是網(wǎng)絡(luò)協(xié)議中常用的一個(gè)校驗(yàn)和機(jī)制鞠抑,我這我們就先按下不表饭聚。
加密
我們?cè)倏匆槐榭蛻?hù)端和服務(wù)端之間的加密機(jī)制:
TLS
協(xié)議是基于TCP
協(xié)議之上的,圖中第一個(gè)藍(lán)色往返是TCP
的握手過(guò)程碍拆,之后兩次橙色的往返若治,我們可以叫做TLS
的握手。握手過(guò)程如下:
-
client1
:TLS
版本號(hào)+所支持加密套件列表+希望使用的TLS
選項(xiàng) -
Server1
:選擇一個(gè)客戶(hù)端的加密套件+自己的公鑰+自己的證書(shū)+希望使用的TLS
選項(xiàng)+(要求客戶(hù)端證書(shū))感混; -
Client2
:(自己的證書(shū))+使用服務(wù)器公鑰和協(xié)商的加密套件加密一個(gè)對(duì)稱(chēng)秘鑰(自己生成的一個(gè)隨機(jī)值)端幼; -
Server2
:使用私鑰解密出對(duì)稱(chēng)秘鑰(隨機(jī)值)后,發(fā)送加密的Finish消息弧满,表明完成握手
這里可能要提一下什么是對(duì)稱(chēng)加密和非對(duì)稱(chēng)加密:
一般的對(duì)稱(chēng)加密像這樣:
encrypt(明文婆跑,秘鑰) = 密文
decrypt(密文,秘鑰) = 明文
也就是說(shuō)加密和解密用的是同一個(gè)秘鑰庭呜。而非對(duì)稱(chēng)加密是這樣的:
encrypt(明文滑进,公鑰) = 密文
decrypt(密文,私鑰) = 明文
加密和解密是需要不同的秘鑰的募谎。
經(jīng)過(guò)這幾次握手成功后扶关,客服端和服務(wù)端之間通信的加密算法和所需要的密鑰也就確定下來(lái)了,之后雙方的交互都可以使用對(duì)稱(chēng)加密算法加密了数冬。
證書(shū)機(jī)制/證書(shū)驗(yàn)證
在TLS
中节槐,我們需要證書(shū)來(lái)保證你所訪(fǎng)問(wèn)的服務(wù)器是真實(shí)的,可信的拐纱。
看這張圖我們來(lái)討論下證書(shū)的驗(yàn)證過(guò)程铜异。
- 客戶(hù)端獲取到了站點(diǎn)證書(shū),拿到了站點(diǎn)的公鑰秸架;
- 要驗(yàn)證站點(diǎn)可信后揍庄,才能使用其公鑰,因此客戶(hù)端找到其站點(diǎn)證書(shū)頒發(fā)者的信息东抹;
- 站點(diǎn)證書(shū)的頒發(fā)者驗(yàn)證了服務(wù)端站點(diǎn)是可信的蚂子,但客戶(hù)端依然不清楚該頒發(fā)者是否可信沃测;
- 再往上回溯,找到了認(rèn)證了中間證書(shū)商的源頭證書(shū)頒發(fā)者缆镣。由于源頭的證書(shū)頒發(fā)者非常少芽突,我們?yōu)g覽器之前就認(rèn)識(shí)了,因此可以認(rèn)為根證書(shū)頒發(fā)者是可信的董瞻;
- 一路倒推,證書(shū)頒發(fā)者可信田巴,那么它所頒發(fā)的所有站點(diǎn)也是可信的钠糊,最終確定了我們所訪(fǎng)問(wèn)的服務(wù)端是可信的;
- 客戶(hù)端使用證書(shū)中的公鑰壹哺,繼續(xù)完成
TLS
的握手過(guò)程抄伍。
那么,客戶(hù)端是是如何驗(yàn)證某個(gè)證書(shū)的有效性管宵,或者驗(yàn)證策略是怎樣的?
證書(shū)頒發(fā)者一般提供兩種方式來(lái)驗(yàn)證證書(shū)的有效性:CRL和OCSP截珍。
CRL
CRL(Certificate Revocation List)
即證書(shū)撤銷(xiāo)名單。證書(shū)頒發(fā)者會(huì)提供一份已經(jīng)失效證書(shū)的名單箩朴,供瀏覽器驗(yàn)證證書(shū)使用岗喉。當(dāng)然這份名單是巨長(zhǎng)無(wú)比的,瀏覽器不可能每次TLS都去下載炸庞,所以常用的做法是瀏覽器會(huì)緩存這份名單钱床,定期做后臺(tái)更新。這樣雖然后臺(tái)更新存在時(shí)間間隔埠居,證書(shū)失效不實(shí)時(shí)查牌,但一般也OK。
OCSP
OCSP(Online Certificate StatusProtocol)
即在線(xiàn)證書(shū)狀態(tài)協(xié)議滥壕。除了離線(xiàn)文件纸颜,證書(shū)頒發(fā)者也會(huì)提供實(shí)時(shí)的查詢(xún)接口,查詢(xún)某個(gè)特定證書(shū)目前是否有效绎橘。實(shí)時(shí)查詢(xún)的問(wèn)題在于瀏覽器需要等待這個(gè)查詢(xún)結(jié)束才能繼續(xù)TLS握手胁孙,延遲會(huì)更大。
以上是站點(diǎn)在證書(shū)頒發(fā)者的角度說(shuō)明會(huì)提供的兩種判斷方式金踪,實(shí)際情況下瀏覽器究竟會(huì)選擇哪種方式判斷浊洞,每個(gè)瀏覽器都會(huì)有自己的實(shí)現(xiàn)。下面是通過(guò)Chrome查看GitHub網(wǎng)站的證書(shū)信息:
到這里差不多了胡岔,有什么不對(duì)的地方法希,歡迎大家留言指出,一起學(xué)習(xí)進(jìn)步靶瘸!
筆者不才苫亦,有些地方還是理解不到位毛肋,若有不正之處,還請(qǐng)耐心指出屋剑,輕噴~润匙。
參看文章