本章是HTTPS那些事兒的第一篇文章,其他相關(guān)文章請參見:前言
本篇主要講解Https的基礎(chǔ)知識,涉及到以下幾點(diǎn):
- HTTP、SSL/TSL矿辽、HTTPS是什么
- HTTPS握手過程
- CA證書是什么
* 注意
本文純手工打造,轉(zhuǎn)載請注明出處郭厌。
HTTP袋倔、SSL/TSL、HTTPS是什么
- HTTP是什么
HTTP的全程是Hyper-Text Transfer Protocol折柠,它可能是當(dāng)今互聯(lián)網(wǎng)上使用的最重要的協(xié)議宾娜。我們?nèi)粘Mㄟ^瀏覽器訪問網(wǎng)站的時候使用的就是該協(xié)議,比如使用PC瀏覽器訪問簡書的首頁扇售,瀏覽器地址欄中會顯示:https://www.reibang.com/前塔。我特意加粗了https,為什么是https不是http呢承冰?請參見"HTTPS是什么"章節(jié)华弓。 - SSL/TSL是什么
首先SSL是Secure Sockets Layer的縮寫,中文翻譯過來是“安全套接層”困乒。它是在上世紀(jì)90年代中期寂屏,由網(wǎng)景公司設(shè)計(jì)的。設(shè)計(jì)該協(xié)議的目的是為了解決HTTP采用明文傳輸娜搂,所帶來的傳輸內(nèi)容會被偷窺(嗅探)和篡改的問題迁霎。
在1999年,SSL 因?yàn)閼?yīng)用廣泛百宇,成為了互聯(lián)網(wǎng)上的事實(shí)標(biāo)準(zhǔn)欧引。IETF 決定把 SSL 標(biāo)準(zhǔn)化,標(biāo)準(zhǔn)化之后的名稱改為 TLS(Transport Layer Security)恳谎,中文翻譯過來是“傳輸層安全協(xié)議”。為什么把SSL和TLS寫成SSL/TLS呢,因?yàn)檫@兩者其實(shí)是同一個東西因痛,只不過是在發(fā)展到不同階段婚苹,名稱不同而已。 - HTTPS是什么
終于說到了重點(diǎn)HTTPS鸵膏,HTTPS是什么呢膊升?說白了HTTPS就是“HTTP 協(xié)議”和“SSL/TLS 協(xié)議”的組合,可以把 HTTPS 大致理解為——“HTTP over SSL”或“HTTP over TLS”(反正 SSL 和 TLS 差不多)谭企。
可以簡單理解為在SSL之上傳輸HTTP協(xié)議廓译,舉個例子:可以把HTTP看成是紙質(zhì)信封包裝的信,可以被輕易打開并查看信的內(nèi)容债查。SSL好比是裝信封的保險(xiǎn)箱非区,保險(xiǎn)箱需要密碼才能打開。加了保險(xiǎn)箱之后的信件盹廷,需要有密碼的人才能查看到征绸,這樣信件的傳輸就更加安全了。
HTTPS握手過程
前面說到SSL是為了解決HTTP明文傳輸帶來的問題俄占,所以SSL采用的是加密傳輸管怠。發(fā)送方通過密鑰加密明文,接收方通過密鑰解密成明文缸榄。該密鑰是傳輸成功的關(guān)鍵渤弛,那么這個密鑰是怎么來的呢?這就涉及到我們所說的HTTPS握手了甚带,握手結(jié)束后發(fā)送方和接收方就會得到密鑰了她肯。那么HTTPS的握手過程是怎么樣的呢?
1). Client Hello
Client發(fā)起連接請求欲低,請求參數(shù)包括客戶端支持的TLS版本列表辕宏、加密算法列表、壓縮算法列表砾莱、隨機(jī)數(shù)random_C和一些擴(kuò)展信息
2). Server Hello
Server接收到Client的Hello請求后瑞筐,根據(jù)Server端的配置以及Client Hello發(fā)送的參數(shù),篩選出與Client最兼容的TLS版本腊瑟、加密算法版本聚假、壓縮算法版本以及隨機(jī)數(shù)random_S
3). Server證書
向client端發(fā)送Server的CA證書
4). Server Hello Finish
通知Client端Server Hello信息發(fā)送結(jié)束
5). 校驗(yàn)Server證書
Client接收到Server證書后,通過本地的證書信任信息進(jìn)行校驗(yàn)闰非,確認(rèn)Server的CA證書是否由可信機(jī)構(gòu)頒發(fā)膘格。除此之外,還會校驗(yàn)證書是否還在有效期财松、域名是否與當(dāng)前訪問域名匹配等
6). Client Key Exchange
Server的CA證書校驗(yàn)通過后瘪贱,Client生成隨機(jī)數(shù)Pre_Master纱控,并采用Server證書中的公鑰加密發(fā)送給Server端。此刻菜秦,客戶端已經(jīng)獲取到全部的生成密鑰需要的信息甜害,則通過協(xié)商的算法生成通信密鑰enc_key:
enc_key=Fuc(**random_C**, **random_S**, **Pre-Master**)
7). Change Cipher Spec
密鑰enc_key生成后,通知Server后續(xù)的通信Client端都使用enc_key進(jìn)行加密通信
8). Finish Handshake
結(jié)合之前所有通信參數(shù)的 hash 值與其它相關(guān)信息生成一段數(shù)據(jù)球昨,使用協(xié)商密鑰 enc_key 與協(xié)商算法將其加密尔店,然后發(fā)送給服務(wù)器用于驗(yàn)證服務(wù)端其生成的enc_key是否正確
9). Change Cipher Spec
Server接收到Client Handshake Finish消息后,生成自己的enc_key主慰,并用enc_key驗(yàn)證Client Handshake Finish信息是否正確嚣州。如果正確,則通知Client后續(xù)通信Server端都使用協(xié)商密鑰enc_key進(jìn)行加密通信
10). Finish Handshake
Server也結(jié)合所有當(dāng)前的通信參數(shù)信息生成一段數(shù)據(jù)并采用協(xié)商密鑰 enc_key與協(xié)商算法加密共螺,并發(fā)送到客戶端
最后该肴,Client端校驗(yàn)Server Finish Handshake信息,如果校驗(yàn)通過璃谨,則會將enc_key作為后續(xù)加密通信的密鑰沙庐。
以上所描述的其實(shí)就是我們說所的單向認(rèn)證過程,如果是雙向認(rèn)證佳吞,只是在單向認(rèn)證的過程中增加Server端對Client端的證書認(rèn)證過程而已拱雏。
CA證書是什么
HTTPS握手過程中,在第3步Server端會發(fā)送其CA證書到Client端底扳。這里所說的CA證書的作用是用來證明當(dāng)前訪問的服務(wù)器是Client想要訪問的服務(wù)器铸抑,而不是他人偽裝成的假服務(wù)器。那么這個CA證書是什么呢衷模?
舉個生活中的例子:
在你去銀行辦卡的時候鹊汛,你要怎么證明你是你呢?一般銀行會要求你出示身份證阱冶,然后驗(yàn)證身份證是否可信刁憋,同時比對上面的照片是不是你。這里所說的身份證就是證明你是你的證據(jù)木蹬,與我們所說的CA證書作用相同至耻。身份證有一個最大的特性:由國家所信任的公安部門頒發(fā)的,銀行可以通過公安部門來校驗(yàn)?zāi)愕纳矸葑C是否可信镊叁。
所以尘颓,為了使CA證書也被大家都信任的話,也引入了類似的機(jī)構(gòu)晦譬,該機(jī)構(gòu)稱為CA(Certification Authority的簡稱)疤苹,該結(jié)構(gòu)頒發(fā)的證書稱為CA證書。HTTPS握手過程中敛腌,Client端會通過本地的證書信任信息校驗(yàn)Server證書卧土,這里所說的證書信任信息其實(shí)就是CA機(jī)構(gòu)相關(guān)的信息惫皱。
CA證書怎么來?
Server端想要獲取到CA證書夸溶,必須向CA機(jī)構(gòu)提出申請逸吵,當(dāng)CA機(jī)構(gòu)審核通過后,才會為Server頒發(fā)證書缝裁。那么這個過程涉及到什么信息呢?
首先CA機(jī)構(gòu)會有自己的公私鑰ca.pub和ca.pri足绅,Server也需要有自己的公私鑰server.pub和server.pri捷绑。
在Server提出申請時,需要提供server.pub和服務(wù)器信息——明文信息(包括證書申請信息氢妈、證書頒發(fā)機(jī)構(gòu)粹污、證書過期時間等)。CA接收到請求后首量,通過各種手段確認(rèn)Server信息的合法性壮吩,通過后會將明文做hash,然后再使用ca.pri對hash進(jìn)行簽名加缘,最后將簽名和明文信息明文放到一起鸭叙,就是我們的CA證書。證書信息類似于下圖:
有了證書后拣宏,Server端就可以使用證書來發(fā)布服務(wù)了沈贝,Client在會使用CA機(jī)構(gòu)公布的ca.pub對Server的CA證書進(jìn)行校驗(yàn):
首先將明文做hash得到h1,然后通過ca.pub來校驗(yàn)h1與證書中的簽名勋乾,也就是公鑰驗(yàn)簽的過程宋下。
如果你是JAVA開發(fā)人員,可以通過JDK提供的工具KeyTool模擬以上描述的證書申請過程辑莫,可以參考本系列的第四篇《使用keytool模擬CA證書頒發(fā)過程》学歧。
總結(jié)
本篇對HTTP、SSL/TSL各吨、HTTPS枝笨,以及HTTPS中設(shè)計(jì)的HTTPS握手和CA證書做了詳細(xì)描述,解釋了HTTPS相關(guān)的基本概念绅你。本系列文章后續(xù)還會講述java中的HTTPS那些事兒以及Spring的RestTemplate與HTTPS伺帘,如果有興趣請參見后續(xù)文章〖删猓可通過此處尋找到本系列文章的目錄伪嫁。