為什么HTTP有時候比HTTPS好?
英文原文: Why HTTP Is Sometimes Better Than HTTPS
做為一家安全公司,我們在站點 Stormpath 上經常被開發者問到的是有關安全方面最優做法的問題。其中一個被經常問到的問題是:
我是否應當在站點上運行 HTTPS?
很不幸,查遍整個因特網,你大多數情況下會得到同樣的建議:加密所有的東西!對所有站點進行 SSL 加密等等!然而,現實情況表明這通常不是一個好的建議。
許多情況下使用 HTTP 比使用 HTTPS 要好很多。事實上,HTTP 是一個在性能上和可用性上比 HTTPS 更好的一種協議,這也就是我們經常推薦客戶使用 HTTP 的原因。下面我們說一說我們的理由……
使用 HTTPS 會出現的問題
HTTPS 是一個錯漏百出的協議. 此協議及其現今流行的實現中許許多多眾所周知的問題使得它不適用于許多各種各樣的 web 服務。
HTTPS 十分緩慢
應用 HTTPS 的主要阻礙之一就是 HTTPS 協議十分緩慢的這一事實。
就其特性而言,HTTPS 就是在兩端之間進行安全的加密通信。這需要兩端都持續耗費寶貴的 CPU 時間周期:
- 一開始說“hello”就決定使用哪種類型的加密方式 (暗號方案套件)
- 驗證 SSL 證書
- 為每一個請求的驗證以及對請求/回應的驗證核實,運行加密代碼
而這聽起來不是特別形象,其實就是加密代碼運行的是 CPU 密集型的操作。它會重度使用浮點運算的 CPU 寄存器,會征用你的 CPU 從而使得請求的處理變慢。
這里有一個內容十分豐富的 ServerFault 線程,展示了在使用代用 Apache2 的一個 Ubuntu 服務器時,相比之下的處理速度你所能預計會有多大的降低:http://serverfault.com/questions/43692/how-much-of-a-performance-hit-for-https-vs-http-for-apache。
如下是結果:
即使是像上面所展示的一個非常簡單的示例,HTTPS 也能將你的 Web 服務器的速度拖慢超過 40 倍! 這可拖了 web 性能很大的后腿.
在今天的環境中, 將你的應用程序作為 REST API 的一個組成部分來構建是很普遍的 — 使用 HTTPS 確實是會拖慢你的網站、影響你的應用程序性能并給你的服務器 CPU 帶來不必要的沖擊的一種方式,而且通常會惹惱你的用戶。
對于許多對速度敏感的應用程序而言,使用原始的 HTTP 常常要好很多。
HTTPS 不是一個放之四海而皆準的安全保障
許多人都會抱有 HTTPS 會讓他們的站點更安全,這樣一種印象。這其實不是真的。
HTTPS 只是對你和服務器之間的流量進行了加密 — 一旦 HTTPS 信息的傳輸中斷了,一切就又都是一場公平的游戲。
這意味著如果你的計算機已經感染的了惡意軟件,或者你已經被受到欺騙運行了某些惡意軟件 — 這個世界上所有的 HTTPS 對于你而言也都無能為力了。
此外,如果 HTTPS 服務器上存在任何的漏洞,某些攻擊者就能夠簡單的等到 HTTPS 已經處理結束,然后再在其它的層(例如 web 服務這一層)抓取到不管什么數據。
SSL 證書本身也經常被濫用。比如,其在瀏覽器上的處理方式就很容易發生錯誤:
- 每種瀏覽器(Mozilla,google 等)都是獨立審計并核準根證書提供商來保證他們安全地處理 SSL 證書
- 一旦核準通過,這些根 SSL 證書就會被添加到瀏覽器的可信證書列表,這意味任何由根證書提供商簽名的證書都是默認可信的。
- 這些提供商因此可隨意亂搞,導致各類安全問題頻發,比如 2011 年發生的 DigiNostar 事件。
以上種種,著名證書授權機構錯誤地簽名了大量的偽造和欺詐的證書,直接損害數以萬計的 Mozilla 用戶的安全。
而 HTTP 并沒有提供任何形式的加密服務,至少你知道你正在處理什么東西。
HTTPS 流量很容易被監聽
如果你正在構建一個需要被不安全的設備(比如移動 app)使用的 web 服務,你可能覺得因為你的服務運行于 HTTPS 上,通信就不會被監聽了。
如果真這么想的話,你就錯了。
其他人可以輕松地在電腦上設置代理來截獲并查看 HTTPS 流量,也就越過了 SSL 證書檢查,這就直接泄漏了你的私人信息。
這篇博文就演示了移動設備上的 https 消息監聽。
你覺得沒多大事?別做夢了!就連 Uber 這種大公司的移動應用都被逆向了,它們也用了 HTTPS。如果你灰心了,我勸你還是別看這篇文章了。
好了,接受現實吧,不管你怎么做,攻擊者都能用這樣或那樣的方法來監聽你的網絡流量。與其把時間浪費在修復 SSL 的問題上,還不如花點時間想想如何明智地使用 HTTP 吧。
HTTPS 有漏洞
大家都知道 HTTPS 并不是鐵板一塊。多年來 HTTPS 被曝出了不少漏洞:
- POODLE (pdf)
- BEAST
- CRIME
- Heartbleed
- …
以后的攻擊會越來越多。再加上 NSA 為了解密,正不遺余力地收集著 SSL 流量——使用 HTTPS 似乎一點用處都沒有,因為不定什么時候你的 HTTPS 流量就會被一覽無余。
HTTPS 太貴
最后要說的一點是 HTTPS 太貴了。你需要從根證書頒發機構購買瀏覽器和客戶端能夠識別的 SSL 證書。
SSL 證書年費從幾美刀到幾千不等——如果你正在構建基于多個微服務(multiple microservices)的分布式應用,你需要買的證書可不只一個。
對于小項目或預算緊張的人來說成本一下子就抬高了不少。
為什么 HTTP 是一個不錯的選擇
在另一方面,讓我們稍稍不那么消極片刻,而是專注于積極的東西 : 是什么使得 HTTP 很棒的。大多數開發者并不欣賞它的好處。
正確條件下的安全
當然 HTTP 本身沒有提供任何安全性,通過正確的設置你的基礎設施和網絡,你可以避免幾乎所有的安全問題。
首先,對于所有的你可能會用到的內部 HTTP 服務, 要確保你的網絡是私有的,不能從公共的外部環境嗅探到數據包. 這意味著你將可能徐昂要將你的 HTTP 服務部署在一個像 Amazon EC2 這樣的非常安全的網絡里面.
通過在 EC2 部署公共的云服務器,就能保證你擁有一流的網絡安全, 防止任何其他的 AWS 用戶嗅探到你的網絡流量.
使用 HTTP 的不安全性來擴展
人們過多的關注于 HTTP 缺乏安全和加密特點的時候,許多人沒有想到的是,這種協議可以提供很好的擴展性。
大部分現代的 Web 應用程序通過隊列來擴展。
你有一個 Web 服務器接受請求,然后用處在相同網絡上的服務器集群運行單獨的 jobs 來處理更多的 CPU 和內存密集型任務。
為了處理任務的排隊,人們通常使用一個諸如 RabbitMQ or Redis 這樣的系統。兩個都是不錯的選擇,但是否可以除了你的網絡外不使用任何基礎設施組件而獲得任務隊列的好處呢?
使用 HTTP,你可以!
它是這樣工作的:
- 建立 Web 服務器和所有處理服務器共享子網的一個網絡。
- 讓你的處理服務器偵聽網絡上的所有數據包,和被動嗅探網絡流量。
- 當 Web 服務器收到 HTTP 流量,那些處理服務器可以簡單地讀取進來的請求(純文本,因為 HTTP 不加密),并立即開始處理工作!
上述系統的工作原理就像一個分布式隊列,快速,高效,簡單。
使用 HTTPS,上述情況是不可能的,但是,通過使用 HTTP,可以大大加快您的應用程序同時去除(不必要的)基礎設施–這是一個大的勝利。
不安全和自負
最后一個我建議使用 HTTP 而不是 HTTPS 的原因:不安全。
是的,HTTP 沒有給你的用戶提供安全,但是,安全真的有必要嗎?
不僅大部分 ISP 監控網絡通信,過去數年的很長一段時間里,很明顯的是政府已經存儲并解密了大量網絡通信。
使用 HTTPS 的顧慮正好比將一個掛鎖來放在一尺高的籬笆上,大致來說,你不可能保證應用的安全。所以,何必這么麻煩呢?
開發僅依靠 HTTP 的服務,這并沒有給你的用戶一種安全的錯覺,或者欺騙用戶認為自身很安全。事實上,他們很有可能認為是不安全的,
開發基于 HTTP 的程序,你的生活將得到簡化,并增強和你用戶的透明。
考慮一下吧。
在逗你玩呢 !! >:)
愚人節快樂哦 !
我喜歡你不會真的任務我會建議你不去使用 HTTPs ! 我想要非常明確的告訴你 : 如果你要構建任何什么類型的 web 應用, 要使用 HTTPS 哦!
你要構建什么類型的應用程序或者服務并不重要,而如果它沒有用到 HTTPS,你就做錯了.
現在,讓我們來聊聊 HTTPS 為什么很棒.
HTTPS 是安全的
HTTPS 是一個業績優良的很棒的協議. 雖然這些年來有過幾次針對其漏洞的利用事件發生, 但它們一直都是相對較為輕微的問題,而且也很快被修復了.
而誠然,NSA 確實在某個陰暗的角落收集著 SSL 流量, 但他們能夠解密即使是很少量 SSL 流量的可能性都是極小的 — 這會需要快速的,功能齊全的量子計算機,并耗費數量驚人的鈔票. 這玩意存在的可能性貌似不存在,因此你可以高枕無憂了,因為你知道你的站點上的 SSL 確實在為你的用戶數據傳輸保駕護航.
HTTPS 速度是快的
上面我曾提到 HTTPS“遭罪似的慢” , 但事實則幾乎完全相反.
HTTPS 確實需要更多的 CPU 來中斷 SSL 連接 — 這需要的處理能力對于現代計算機而言是小菜一碟了. 你會遇到 SSL 性能瓶頸的可能性完全為 0.
目前你更有可能在你的應用程序或者 web 服務器性能上遇到瓶頸.
HTTPS 是一個重要的保障
雖然 HTTPS 并不放之四海而皆準的 web 安全方案,但是沒有它你就不能以策萬全.
所有的 web 安全都倚賴你擁有了 HTTPS. 如果你沒有它, 那么不管你對你的密碼做了多強的哈希加密,或者做了多少數據加密,攻擊者都可以簡單的模擬一個客戶端的網絡連接,讀取它們的安全憑證——然后轟的一聲——你的安全小把戲結束了.
因此 — 雖然你不能有賴于 HTTPS 解決所有的安全問題,你絕對 100% 需要將其應用于你構建的所有服務上 — 否則完全沒有任何辦法保證你的應用程序的安全.
此外,雖然證書簽名很顯然不是一個完美的實踐,但每一種瀏覽器廠商針對認證機構都有相當嚴格和嚴謹的規則. 要成為一個受到信任的認證機構是非常難的,而且要保持自己良好的信譽也同樣是困難的.
Mozilla (以及其其他廠商) 在將不良根認證機構踢出局這項工作方面表現相當出色,而且一般也真正是互聯網安全的好管家.
HTTPS 流量攔截是可以避免的
先前我提到過,可以很容易的通過創建屬于你自己的 SSL 證書、信任它們,從而在 SSL 通訊的中途攔截到流量.
雖然這絕對有可能,但也很容易可以通過 SSL 證書鋼釘 來避免 .
本質上講,依照上面鏈接的文章中給出的準則, 你可以是的你的客戶只去信任真正可用的 SSL 證書,有效的阻擋所有類型的 SSL MITM 攻擊,甚至在它們開始之前 =)
如果你是要把 SSL 服務部署到一個不受信任的位置(像是一個移動或者桌面應用), 你最應該考慮使用 SSL 證書鋼釘.
HTTPS(再也)不貴了
雖然歷史上 HTTPS 曾經昂貴過,而這是事實 — 但再也不是這樣了. 如今你能夠從許許多多的 web 主機那里買到非常便宜的 SSL 證書.
此外, EFF (電子前沿基金會) 正要推出一個完全免費的 SSL 證書提供機構: https://letsencrypt.org/
它會在 2015 推出, 并必然將改變所有 web 開發者的游戲規則. 一旦讓加密的方案上線,你就能夠對你的網站和服務進行 100% 的加密,完全沒有任何花費.
請一定要訪問他們的網站,并訂閱更新哦!
HTTP 在私有網絡上并不是安全的
早些時候,我談到 HTTP 的安全性怎么是不重要的,特別是如果你的網絡被鎖上(這里的意思是切斷了同公共網絡的聯系) — 我是在騙你。
而網絡安全是重要的,傳輸的加密也是!
如果一個攻擊者獲得了對你的任何內部服務的訪問權限,所有的 HTTP 流量都將會被攔截和解讀, 不管你的網絡可能會有多“安全”. 這很不妙哦。
這就是為什么 HTTPS 不管是在公共網絡還是私有網絡都極其重要的原因。
額外的信息: 如果你是吧服務部署在 AWS 上面,就不要想讓你的網絡流量是私有的了! AWS 網絡就是公共的,這意味著其它的 AWS 用戶都潛在的能夠嗅探到你的網絡流量 — 要非常小心了。
我早些時候有提到,HTTP 可以用來代替隊列,是的,我沒說錯,但這是一個很可怕的主意!
由于安全原因,放大服務的規模,是一個很可怕的,糟糕的注意。請不要這么做。
(除非這是一個概念證據,只為了造一個很酷的演示產品而已)
總結
如果你正在做網頁服務,毫無疑問,你應該使用 HTTPS。
它很容易、廉價,且能獲得用戶信任,沒有理由不用它。作為碼農,我們必須要承擔起保護用戶的重任,要做到那點,方法之一就是強制使用 HTTPS、
希望你喜歡這篇文章,供君一樂。