今年的3月開始,咱們啓動了 HTTPS 改造項目,並首先在微店買買和交易下單兩個業務上進行試點。此次試點,一是爲全站 HTTPS 改造進行全面的技術摸底,同時也是要沉澱出通用的解決方案,讓後續的全站 HTTPS 快速推動。線上效果可點擊連接 微店買買h5,購物車h5,下單h5,或下載最新版口袋購物APP查看。html
下面對項目過程當中遇到的問題和一些思考,與你們分享一下。前端
決定要進行 HTTPS 改造並不是一時之興致,而是出於對現狀的考慮。nginx
一方面,在當前的網絡環境下,一些問題正變得愈來愈突出:算法
運營商劫持插入廣告的狀況愈來愈嚴重,極度影響微店的產品品牌與用戶體驗segmentfault
HTTP 採用明文傳輸,中間者藉此盜取信息、篡改請求,用戶隱私和安全沒法保障後端
另外一方面,HTTPS 化是將來的技術趨勢。瀏覽器
在可見的將來,HTTP2 只在 HTTPS 環境下被支持安全
iOS9 要求應用程序必須採用 HTTPS 傳輸性能優化
咱們看到,過去的一年中,HTTPS 化正逐漸被國內互聯網公司所重視起來:服務器
阿里巴巴,去年雙11前實現了全站HTTPS
百度搜索,去年3月實現了全站HTTPS
豆瓣、知乎等社交網站,也實現了全站 HTTPS
什麼是 HTTPS ?維基百科 是這樣描述的, HTTPS 是一種用於計算機網絡傳輸的安全通信協議,也被稱爲 HTTP over TLS/SSL
,它由 HTTP 通信協議和基於 TLS/SSL 的加密協議組成。
SSL 最初由 Netscape 公司開發,TLS 則是 SSL 的繼承者和升級版。目前 SSL 各版本都已被發現漏洞,所以不建議採用 SSL 協議實現 HTTPS,本文爲了敘述方便,後面統一用 TLS 來指代 TLS/SSL。
TLS 在整個 TPC/IP 分層結構中,處於應用層 HTTP 之下,傳輸層 TCP 之上。它經過提供身份認證、信息隱私性、內容一致性三大特性來支持安全通信功能。
身份認證。身份認證發生在 TLS 握手階段,用於驗證 HTTPS 證書的合法性和時間有效性。
信息隱私性。在 TLS 握手階段,客戶端和服務端會協商產生一對對稱祕鑰。應用數據在發送端加密,接收端解密,加密傳輸。因爲祕鑰是動態生成且只有傳輸雙方可知,即便信息被中間人劫持,也沒法恢復成原始數據,這保障了信息的隱私性。
內容一致性。發送方在發送數據前,會對數據進行內容摘要並加密生成 MAC,而後將該 MAC 一併發送出去。接收方接收到數據和MAC,經過一樣的算法生成內容摘要,並解密 MAC 獲得原始數據的內容摘要。經過對比兩個數據摘要是否一致,來發現信息僞造、丟失、篡改的狀況,保障內容一致性。
在瀏覽器中,咱們將在 HTTPS 網頁中所加載的 HTTP 資源稱之爲 Mixed Content。W3C 規範 將 Mixed Content 分紅兩類,Optionally-blockable Content 和 Blockable Content。
Optionally-blockable Content 是指那些危險較小,即便被中間人篡改也無大礙的資源。現代瀏覽器默認會加載這類資源,同時在控制檯打印出警告信息。
Blockable Content 若是被中間人篡改,則會引起安全問題,瀏覽器必須禁止加載這類資源。在現代瀏覽器中,HTTPS 頁面中的 JavaScript、CSS、XHR、Font、Iframe 等 HTTP 資源,都會被禁止加載,並直接在控制檯打印錯誤信息。
HTTPS 頁面中的 HTTP 資源 | 瀏覽器行爲 |
---|---|
圖片、視頻、音頻 | 加載,warning |
CSS | 不加載,error |
JavaScript | 不加載,error |
Iframe | 不加載,error |
XHR | 不加載,error |
Font | 不加載,error |
瞭解什麼是 HTTPS,什麼是 Mixed Content,是咱們設計技術方案的基礎。下面我主要分爲後端、前端(Web 與 APP)、運維三部分來講明 HTTPS 改造的技術方案。
在進行 HTTPS 改造以前,咱們每一個後端業務獨立擁有一套域名。這次 HTTPS 改造,引入了 VAP(vdian API Platform) 做爲先後端的統一接入層。引入 VAP 以後:
後端業務系統經過 VAP 對外提供 HTTPS/HTTP 形式的接口服務,後端業務系統與 VAP 之間經過 Dubbo/HTTP 通信。全部接口,都在 VAP 中進行統一管理和監控,提高總體技術架構的健壯性。
前端應用(Web、IOS、Android)直接向 VAP 調用服務接口,高度統一了先後端通信機制。
全部線上接口都收斂至 vap.gw.weidian.com
域名和對應集羣,下降了運維成本。
VAP 系統架構圖
從前端角度看,首先須要支持域名的 HTTPS/HTTP 雙協議訪問。爲了讓 HTTPS 改造更加規範,前端升級了前端發佈系統,並進行域名收斂:
前端動態內容統一到 h5.weidian.com
靜態資源CDN統一到 assets.geilicdn.com
圖片CDN統一到 wd.geilicdn.com
後端接口統一到 VAP系統 vap.gw.weidian.com
域名的收斂,一方面簡化了技術架構的複雜度,另外一方面是出於性能考慮。在 HTTPS 場景下,多域名帶來更多的 TLS 握手,會下降服務端和客戶端的性能。經過域名收斂,併發揮 HTTP2/SPDY 的多路複用,能在減小 TLS 握手的同時,提高網絡資源的並行下載能力,一箭雙鵰。
在代碼改造上,主要分爲三個場景:
若是當前資源或頁面跳轉只支持 HTTP 或 HTTPS 協議,則使用支持的協議
若是當前資源同時 HTTP 和 HTTPS 協議,需自動適配
靜態資源的URL,採用 //
引用資源,表示聽從當前頁面的協議,瀏覽器會進行自動補全。
動態數據中的URL,根據發起請求的協議,返回數據中的URL自動補全爲請求時的協議。好比當以 HTTPS 方式發起請求,則返回的圖片地址是 HTTPS 起始的,同理,若是以 HTTP 方式發起,則圖片地址是 HTTP 的。
運維同窗的工做,一是購買 HTTPS 證書,二是配置服務器環境。在 HTTPS 配置上,除了關注自己的可用性,也須要留意性能和安全。
在 HTTPS 性能上,咱們作了幾個優化:
開啓 SPDY 和 HTTP2 支持,藉助多路複用提高傳輸性能。
開啓會話複用,減小 TLS 握手的時間與性能消耗。
開啓 HSTS,強制 HTTPS 訪問,減小與服務端的交互。
配置完整的證書鏈,離線完成證書的鏈式認證。
開啓 OCSP stapling,離線完成證書在線狀態檢測。
在 HTTPS 安全上,須要注意:
避免使用 SSL,並優先使用最新的 TLS 1.2 協議
選擇強加密的加密套件,選擇支持前向安全性的加密套件
若是你對本身的配置不太放心,能夠到 ssllabs 對當前網站的 HTTPS 配置進行檢測和評分,如下是咱們四個域名的 HTTPS 評分。
域名 | SSL 配置評分 |
---|---|
h5.weidian.com |
A |
vap.gw.weidian.com |
A |
assets.geilicdn.com |
A- |
wd.geilicdn.com |
A- |
出於升級過程當中的穩定性考慮,須要保證 HTTPS/HTTP 兩套邏輯同時在線上保持可用。一旦 HTTPS 環境下出現不可解決的問題,可以快速降級到 HTTP。
小流量方案。對於重要業務,採用小流量的方案,逐步將 HTTP 流量引導成 HTTPS 流量。一旦出現問題,直接將 HTTP 流量切換 100%,就能快速降級。
快速切換開關。APP 經過下發配置項,能實時控制 APP 採用 HTTPS 或者 HTTP 協議;對於 H5 來講,則是經過運維修改 nginx 配置,返回 302 重定向,來實現全站流量的降級或升級。
通過這次 HTTPS 改造,咱們的收穫是
解決運營商內容劫持和中間人劫持的問題,提高用戶體驗,保障用戶的通信安全。
積累出先後端一整套的 HTTPS 化解決方案,讓新業務和現有業務快速支持 HTTPS。
先後端統一接入層 VAP 的引入,讓總體技術架構擁有更好的擴展性。
目前趕上的一些挑戰和規劃:
域名劫持問題。在上線 HTTPS 後,咱們發如今部分區域存在運營商域名劫持的狀況。短時間內咱們是經過協議降級和運營商投訴進行了解決;長期來講,則會經過HTTPDNS和運維能力的提高,優先去規避域名劫持,其次是提高快速發現和響應的能力。
全站 HTTPS 改造的落地。計劃在8月底,讓線上的原有業務和新業務所有走 HTTPS 流量。而後再穩定一段時間後,咱們的開發和測試環境將只採用 HTTPS ,再也不支持 HTTP。
VAP 後續會持續提高穩定性、性能、安全性、易用性等方面,發揮出更大的技術價值。
性能優化的最佳實踐。隨着移動端對 SPDY 和 HTTP2 的支持度愈來愈高,客戶端在網絡請求併發上擁有更大的優點,咱們將持續作一些小實驗與觀察,以沉澱出性能的最佳實踐方案。下圖是咱們現有的性能數據狀況,能夠看到仍然存在很大的優化空間。
最後再總結一句,HTTPS改造既是一個很大的技術挑戰,同時也是一個很好的機會。藉助這個機會,讓咱們能及時還清技術債務,使技術架構更加清晰和明朗,來更快速地支持業務的飛速發展。若是你對 HTTPS 有興趣,或者有獨到的看法和建議,歡迎溝通交流,另外咱們還招人https://segmentfault.com/o/weidian/jobs。