做為一家安全公司,我們在站點Stormpath上經常被開發者問到的是有關安全方面最優做法的問題。其中一個被經常問到的問題是:
我是否應當在站點上運行HTTPS?
很不幸,查遍整個因特網,你大多數情況下會得到同樣的建議:加密所有的東西!對所有站點進行SSL加密等等!然而,現實情況表明這通常不是一個好的建議。
許多情況下使用HTTP比使用HTTPS要好很多。事實上,HTTP是一個在性能上和可用性上比HTTPS更好的一種協議,這也就是我們經常推薦客戶使用HTTP的原因。下面我們說一說我們的理由......
使用 HTTPS 會出現的問題
HTTPS 是一個錯漏百出的協議. 此協議及其現今流行的實現中許許多多眾所周知的問題使得它不適用於許多各種各樣的web服務。
應用 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 並沒有提供任何形式的加密服務,至少你知道你正在處理什麼東西。
如果你正在構建一個需要被不安全的設備(比如移動 app)使用的 web 服務,你可能覺得因為你的服務運行於 HTTPS 上,通信就不會被監聽了。
如果真這麼想的話,你就錯了。
其他人可以輕松地在電腦上設置代理來截獲並查看HTTPS流量,也就越過了SSL證書檢查,這就直接洩漏了你的私人信息。
這篇博文就演示了移動設備上的 https 消息監聽。
你覺得沒多大事?別做夢了!就連Uber這種大公司的移動應用都被逆向了,它們也用了 HTTPS。如果你灰心了,我勸你還是別看這篇文章了。
好了,接受現實吧,不管你怎麼做,攻擊者都能用這樣或那樣的方法來監聽你的網絡流量。與其把時間浪費在修復 SSL 的問題上,還不如花點時間想想如何明智地使用 HTTP 吧。
大家都知道 HTTPS 並不是鐵板一塊。多年來 HTTPS 被曝出了不少漏洞:
POODLE (pdf)
BEAST
CRIME
Heartbleed
…
以後的攻擊會越來越多。再加上 NSA 為了解密,正不遺余力地收集著 SSL 流量——使用 HTTPS 似乎一點用處都沒有,因為不定什麼時候你的 HTTPS 流量就會被一覽無余。
最後要說的一點是 HTTPS 太貴了。你需要從根證書頒發機構購買浏覽器和客戶端能夠識別的 SSL 證書。
這可不便宜啊。
SSL 證書年費從幾美刀到幾千不等——如果你正在構建基於多個微服務(multiple microservices)的分布式應用,你需要買的證書可不只一個。
對於小項目或預算緊張的人來說成本一下子就抬高了不少。
在另一方面,讓我們稍稍不那麼消極片刻,而是專注於積極的東西 : 是什麼使得HTTP很棒的。大多數開發者並不欣賞它的好處。
當然HTTP本身沒有提供任何安全性,通過正確的設置你的基礎設施和網絡,你可以避免幾乎所有的安全問題。
首先,對於所有的你可能會用到的內部HTTP服務, 要確保你的網絡是私有的,不能從公共的外部環境嗅探到數據包. 這意味著你將可能徐昂要將你的HTTP服務部署在一個像Amazon EC2這樣的非常安全的網絡裡面.
通過在 EC2 部署公共的雲服務器,就能保證你擁有一流的網絡安全, 防止任何其他的AWS用戶嗅探到你的網絡流量.
人們過多的關注於 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 是一個業績優良的很棒的協議. 雖然這些年來有過幾次針對其漏洞的利用事件發生, 但它們一直都是相對較為輕微的問題,而且也很快被修復了.
而誠然,NSA確實在某個陰暗的角落收集著SSL流量, 但他們能夠解密即使是很少量SSL流量的可能性都是極小的 — 這會需要快速的,功能齊全的量子計算機,並耗費數量驚人的鈔票. 這玩意存在的可能性貌似不存在,因此你可以高枕無憂了,因為你知道你的站點上的SSL確實在為你的用戶數據傳輸保駕護航.
上面我曾提到HTTPS“遭罪似的慢” , 但事實則幾乎完全相反.
HTTPS 確實需要更多的CPU來中斷 SSL 連接 — 這需要的處理能力對於現代計算機而言是小菜一碟了. 你會遇到SSL性能瓶頸的可能性完全為0.
目前你更有可能在你的應用程序或者web服務器性能上遇到瓶頸.
雖然 HTTPS 並不放之四海而皆准的web安全方案,但是沒有它你就不能以策萬全.
所有的web安全都倚賴你擁有了 HTTPS. 如果你沒有它, 那麼不管你對你的密碼做了多強的哈希加密,或者做了多少數據加密,攻擊者都可以簡單的模擬一個客戶端的網絡連接,讀取它們的安全憑證——然後轟的一聲——你的安全小把戲結束了.
因此 — 雖然你不能有賴於HTTPS解決所有的安全問題,你絕對100%需要將其應用於你構建的所有服務上 — 否則完全沒有任何辦法保證你的應用程序的安全.
此外,雖然證書簽名很顯然不是一個完美的實踐,但每一種浏覽器廠商針對認證機構都有相當嚴格和嚴謹的規則. 要成為一個受到信任的認證機構是非常難的,而且要保持自己良好的信譽也同樣是困難的.
Mozilla (以及其其他廠商) 在將不良根認證機構踢出局這項工作方面表現相當出色,而且一般也真正是互聯網安全的好管家.
先前我提到過,可以很容易的通過創建屬於你自己的SSL證書、信任它們,從而在SSL通訊的中途攔截到流量.
雖然這絕對有可能,但也很容易可以通過 SSL 證書鋼釘 來避免 .
本質上講,依照上面鏈接的文章中給出的准則, 你可以是的你的客戶只去信任真正可用的SSL證書,有效的阻擋所有類型的SSL MITM攻擊,甚至在它們開始之前 =)
如果你是要把SSL服務部署到一個不受信任的位置(像是一個移動或者桌面應用), 你最應該考慮使用SSL證書鋼釘.
雖然歷史上HTTPS曾經昂貴過,而這是事實 — 但再也不是這樣了. 如今你能夠從許許多多的web主機那裡買到非常便宜的SSL證書.
此外, EFF (電子前沿基金會) 正要推出一個完全免費的 SSL 證書提供機構: https://letsencrypt.org/
它會在 2015 推出, 並必然將改變所有web開發者的游戲規則. 一旦讓加密的方案上線,你就能夠對你的網站和服務進行100%的加密,完全沒有任何花費.
請一定要訪問他們的網站,並訂閱更新哦!
早些時候,我談到HTTP的安全性怎麼是不重要的,特別是如果你的網絡被鎖上(這裡的意思是切斷了同公共網絡的聯系) — 我是在騙你。
而網絡安全是重要的,傳輸的加密也是!
如果一個攻擊者獲得了對你的任何內部服務的訪問權限,所有的HTTP流量都將會被攔截和解讀, 不管你的網絡可能會有多“安全”. 這很不妙哦。
這就是為什麼 HTTPS 不管是在公共網絡還是私有網絡都極其重要的原因。
額外的信息: 如果你是吧服務部署在AWS上面,就不要想讓你的網絡流量是私有的了! AWS 網絡就是公共的,這意味著其它的AWS用戶都潛在的能夠嗅探到你的網絡流量 — 要非常小心了。
我早些時候有提到,HTTP可以用來代替隊列,是的,我沒說錯,但這是一個很可怕的主意!
由於安全原因,放大服務的規模,是一個很可怕的,糟糕的注意。請不要這麼做。
(除非這是一個概念證據,只為了造一個很酷的演示產品而已)
如果你正在做網頁服務,毫無疑問,你應該使用HTTPS。
它很容易、廉價,且能獲得用戶信任,沒有理由不用它。作為碼農,我們必須要承擔起保護用戶的重任,要做到那點,方法之一就是強制使用HTTPS、
希望你喜歡這篇文章,供君一樂。
譯文:http://www.oschina.net/translate/why-http-is-sometimes-better-than-https