前言:由于微信小程序要求必須通過 HTTPS 完成與服務(wù)端通信,若開發(fā)者選擇自行搭建 HTTPS 服務(wù),那需要自行 SSL 證書申請(qǐng)、部署,完成 https 服務(wù)搭建。故借此學(xué)習(xí)了一下HTTPS協(xié)議。
什么是HTTPS?
HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer),即安全套接字層超文本傳輸協(xié)議,是以安全為目標(biāo)的HTTP通道,簡(jiǎn)單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎(chǔ)是SSL,因此加密的詳細(xì)內(nèi)容就需要SSL。 它是一個(gè)URI scheme(抽象標(biāo)識(shí)符體系),句法類同http:體系。用于安全的HTTP數(shù)據(jù)傳輸。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默認(rèn)端口及一個(gè)加密/身份驗(yàn)證層(在HTTP與TCP之間)。這個(gè)系統(tǒng)的最初研發(fā)由網(wǎng)景公司(Netscape)進(jìn)行,并內(nèi)置于其瀏覽器Netscape Navigator中,提供了身份驗(yàn)證與加密通訊方法?,F(xiàn)在它被廣泛用于萬維網(wǎng)上安全敏感的通訊,例如交易支付方面。
HTTPS和HTTP的區(qū)別
超文本傳輸協(xié)議HTTP協(xié)議被用于在Web瀏覽器和網(wǎng)站服務(wù)器之間傳遞信息。HTTP協(xié)議以明文方式發(fā)送內(nèi)容,不提供任何方式的數(shù)據(jù)加密,如果攻擊者截取了Web瀏覽器和網(wǎng)站服務(wù)器之間的傳輸報(bào)文,就可以直接讀懂其中的信息,因此HTTP協(xié)議不適合傳輸一些敏感信息,比如信用卡號(hào)、密碼等。
為了解決HTTP協(xié)議的這一缺陷,需要使用另一種協(xié)議:安全套接字層超文本傳輸協(xié)議HTTPS。為了數(shù)據(jù)傳輸?shù)陌踩?,HTTPS在HTTP的基礎(chǔ)上加入了SSL協(xié)議,SSL依靠證書來驗(yàn)證服務(wù)器的身份,并為瀏覽器和服務(wù)器之間的通信加密。
HTTPS和HTTP的區(qū)別主要為以下四點(diǎn):
一、https協(xié)議需要到ca申請(qǐng)證書,一般免費(fèi)證書很少,需要交費(fèi)。
二、http是超文本傳輸協(xié)議,信息是明文傳輸,https 則是具有安全性的ssl加密傳輸協(xié)議。
三、http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。
四、http的連接很簡(jiǎn)單,是無狀態(tài)的;HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,比http協(xié)議安全。
什么是SSL/TLS?
SSL(Secure Sockets Layer 安全套接層),及其繼任者傳輸層安全(Transport Layer Security,TLS)是為網(wǎng)絡(luò)通信提供安全及數(shù)據(jù)完整性的一種安全協(xié)議。TLS與SSL在傳輸層對(duì)網(wǎng)絡(luò)連接進(jìn)行加密。
SSL (Secure Socket Layer)為Netscape所研發(fā),用以保障在Internet上數(shù)據(jù)傳輸之安全,利用數(shù)據(jù)加密(Encryption)技術(shù),可確保數(shù)據(jù)在網(wǎng)絡(luò)上之傳輸過程中不會(huì)被截取及竊聽。目前一般通用之規(guī)格為40 bit之安全標(biāo)準(zhǔn),美國(guó)則已推出128 bit之更高安全標(biāo)準(zhǔn),但限制出境。只要3.0版本以上之I.E.或Netscape瀏覽器即可支持SSL。
當(dāng)前版本為3.0。它已被廣泛地用于Web瀏覽器與服務(wù)器之間的身份認(rèn)證和加密數(shù)據(jù)傳輸。
SSL協(xié)議位于TCP/IP協(xié)議與各種應(yīng)用層協(xié)議之間,為數(shù)據(jù)通訊提供安全支持。SSL協(xié)議可分為兩層:SSL記錄協(xié)議(SSL Record Protocol):它建立在可靠的傳輸協(xié)議(如TCP)之上,為高層協(xié)議提供數(shù)據(jù)封裝、壓縮、加密等基本功能的支持。SSL握手協(xié)議(SSL Handshake Protocol):它建立在SSL記錄協(xié)議之上,用于在實(shí)際的數(shù)據(jù)傳輸開始前,通訊雙方進(jìn)行身份認(rèn)證、協(xié)商加密算法、交換加密密鑰等。
一、作用
不使用SSL/TLS的HTTP通信,就是不加密的通信。所有信息明文傳播,帶來了三大風(fēng)險(xiǎn)。
(1) 竊聽風(fēng)險(xiǎn)(eavesdropping):第三方可以獲知通信內(nèi)容。
(2) 篡改風(fēng)險(xiǎn)(tampering):第三方可以修改通信內(nèi)容。
(3) 冒充風(fēng)險(xiǎn)(pretending):第三方可以冒充他人身份參與通信。
SSL/TLS協(xié)議是為了解決這三大風(fēng)險(xiǎn)而設(shè)計(jì)的,希望達(dá)到:
(1) 所有信息都是加密傳播,第三方無法竊聽。
(2) 具有校驗(yàn)機(jī)制,一旦被篡改,通信雙方會(huì)立刻發(fā)現(xiàn)。
(3) 配備身份證書,防止身份被冒充。
二、歷史
1994年,NetScape公司設(shè)計(jì)了SSL協(xié)議(Secure Sockets Layer)的1.0版,但是未發(fā)布。
1995年,NetScape公司發(fā)布SSL 2.0版,很快發(fā)現(xiàn)有嚴(yán)重漏洞。
1996年,SSL 3.0版問世,得到大規(guī)模應(yīng)用。
1999年,互聯(lián)網(wǎng)標(biāo)準(zhǔn)化組織ISOC接替NetScape公司,發(fā)布了SSL的升級(jí)版[TLS](http://en.wikipedia.org/wiki/Secure_Sockets_Layer) 1.0版。
2006年和2008年,TLS進(jìn)行了兩次升級(jí),分別為TLS 1.1版和TLS 1.2版。最新的變動(dòng)是2011年TLS 1.2的[修訂版](http://tools.ietf.org/html/rfc6176)。
目前,應(yīng)用最廣泛的是TLS 1.0,接下來是SSL 3.0。但是,主流瀏覽器都已經(jīng)實(shí)現(xiàn)了TLS 1.2的支持。
TLS 1.0通常被標(biāo)示為SSL 3.1,TLS 1.1為SSL 3.2,TLS 1.2為SSL 3.3。
三、基本的運(yùn)行過程
(1) 客戶端向服務(wù)器端索要并驗(yàn)證公鑰。
(2) 雙方協(xié)商生成"對(duì)話密鑰"。
(3) 雙方采用"對(duì)話密鑰"進(jìn)行加密通信。
上面過程的前兩步,又稱為"握手階段"(handshake)。

** 第一步 客戶端發(fā)出請(qǐng)求(ClientHello)**
(1) 支持的協(xié)議版本,比如TLS 1.0版。
(2) 一個(gè)客戶端生成的隨機(jī)數(shù),稍后用于生成"對(duì)話密鑰"。
(3) 支持的加密方法,比如RSA公鑰加密。
(4) 支持的壓縮方法。
** 第二步 服務(wù)器回應(yīng)(SeverHello)**
(1) 確認(rèn)使用的加密通信協(xié)議版本,比如TLS 1.0版本。如果瀏覽器與服務(wù)器支持的版本不一致,服務(wù)器關(guān)閉加密通信。
(2) 一個(gè)服務(wù)器生成的隨機(jī)數(shù),稍后用于生成"對(duì)話密鑰"。
(3) 確認(rèn)使用的加密方法,比如RSA公鑰加密。
(4) 服務(wù)器證書。
** 第三步 客戶端回應(yīng)**
(1) 一個(gè)隨機(jī)數(shù)。該隨機(jī)數(shù)用服務(wù)器公鑰加密,防止被竊聽。
(2) 編碼改變通知,表示隨后的信息都將用雙方商定的加密方法和密鑰發(fā)送。
(3) 客戶端握手結(jié)束通知,表示客戶端的握手階段已經(jīng)結(jié)束。這一項(xiàng)同時(shí)也是前面發(fā)送的所有內(nèi)容的hash值,用來供服務(wù)器校驗(yàn)。
** 第四步 服務(wù)器的最后回應(yīng)**
(1)編碼改變通知,表示隨后的信息都將用雙方商定的加密方法和密鑰發(fā)送。
(2)服務(wù)器握手結(jié)束通知,表示服務(wù)器的握手階段已經(jīng)結(jié)束。這一項(xiàng)同時(shí)也是前面發(fā)送的所有內(nèi)容的hash值,用來供客戶端校驗(yàn)。
至此,整個(gè)握手階段全部結(jié)束。接下來,客戶端與服務(wù)器進(jìn)入加密通信,就完全是使用普通的HTTP協(xié)議,只不過用"會(huì)話密鑰"加密內(nèi)容。
HTTPS的普及之路
事實(shí)上 HTTPS 1995 年就誕生了,是一個(gè)非常古老、成熟的協(xié)議。同時(shí)又能很好地防止內(nèi)容劫持,保護(hù)用戶隱私。但是為什么一直到今天,還有大部分的網(wǎng)站不支持 HTTPS,只使用 HTTP 呢?

影響 HTTPS 普及的主要原因可以概括為兩個(gè)字:「慢」和「貴」。
(1)慢
在未經(jīng)任何優(yōu)化的情況下,HTTPS 會(huì)嚴(yán)重降低用戶的訪問速度。主要因素包括:
網(wǎng)絡(luò)耗時(shí)。由于協(xié)議的規(guī)定,必須要進(jìn)行的網(wǎng)絡(luò)傳輸。比如 SSL 完全握手,302 跳轉(zhuǎn)等。最壞情況下可能要增加 7 個(gè) RTT。

計(jì)算耗時(shí)。無論是客戶端還是服務(wù)端,都需要進(jìn)行對(duì)稱加解密,協(xié)議解析,私鑰計(jì)算,證書校驗(yàn)等計(jì)算,增加大量的計(jì)算時(shí)間。
(2)貴
HTTPS 的貴,主要體現(xiàn)在如下三方面:
1、服務(wù)器成本。HTTPS 的私鑰計(jì)算會(huì)導(dǎo)致服務(wù)端性能的急劇下降,甚至不到 HTTP 協(xié)議的十分之一,也就是說,如果 HTTP 的性能是 10000cps,HTTPS 的性能可能只有幾百 cps,會(huì)增加數(shù)倍甚至數(shù)十倍的服務(wù)器成本。
2、證書成本。根據(jù)證書個(gè)數(shù)及證書類型,一年可能需要花費(fèi)幾百到幾百萬不等的證書成本。
3、開發(fā)和運(yùn)維成本。HTTPS 協(xié)議比較復(fù)雜,openssl 的開源實(shí)現(xiàn)也經(jīng)常發(fā)生安全BUG, 包括協(xié)議的配置,證書的更新,過期監(jiān)控,客戶端的兼容等一系列問題都需要具備專業(yè)背景的技術(shù)人員跟進(jìn)處理。
(完)
其實(shí)不僅僅是小程序,蘋果 iOS 平臺(tái),Google Android 在 2017 也逐步強(qiáng)制要求開發(fā)者使用 HTTPS 接入。在下一章,我們將學(xué)習(xí)如何搭建HTTPS服務(wù),敬請(qǐng)期待!
參考文獻(xiàn) :