HTTPS是非常基礎和有效的安全方式,可以較好的防御中間人攻擊。
網上關于HTTPS的詳細介紹已經非常多了,這里只備忘一些有趣的細節(jié),快速解惑之用。
原理
HTTP在傳輸過程中是不加密的,因此傳輸過程中非常容易受到嗅探和劫持。
HTTPS在客戶端(通常是瀏覽器)和服務端增加了加解密環(huán)節(jié),從而保證傳輸過程數據是加密的。
安全備忘
1、HTTPS支持單向認證和雙向認證。
? ? ?單向認證是主要方式,即客戶端驗證服務端證書有效性。
? ? ?雙向認證主要應用于企業(yè)級應用,這種情況下,服務端也會驗證客戶端證書,因此意味著雙方是互相提前知曉的,因此也只有在企業(yè)級場景下才可以達成。
2、HTTPS單向認證傳輸過程依然可以嗅探和劫持。
? ? ?單向認證情況下,傳輸過程依然可以實現嗅探和劫持。
? ? ?首先服務端并不驗證客戶端有效性,而客戶端只驗證服務端證書的有效性,因此只要中間傳輸過程通過代理方式成功欺騙客戶端即可。
? ? ?有兩種情況:
? ? ?1)中間人使用虛假證書。此時一般客戶端瀏覽器雖然驗證發(fā)現證書存在問題,只會提示不安全,用戶依然可以手動同意訪問。很多普通用戶安全知識缺乏,常常會忽略瀏覽器的不安全提示。
? ? 2)瀏覽器是通過驗證證書根簽名以及域名、IP等附屬信息一致性來驗證瀏覽器證書。因此有些中間攻擊會去正規(guī)根證書中心簽名,從而合法有效的證書。這時候瀏覽器自然不會發(fā)現異常,用戶也就無從知曉。正是因為這個問題,有些根證書中心因為濫發(fā)簽名的問題,被Chrome、Firefox等瀏覽器不再信任。
3、HTTPS單向認證不保證服務端安全性
? ?服務端不驗證客戶端的有效性,因此服務端的安全性依然需要自行防護。
? ?有沒有HTTPS,服務端都需要防CSRF、防注入、防DDOS……
4、最好使用有效的根證書機構簽發(fā)的證書。
? ? 使用自簽名證書當然是可以的,缺點是需要客戶端導入根證書信息,從而認可服務端合法性。導入證書的事情在2C場景下基本無法達成。
? ? 由于Chrome、Firefox、IE等常見里瀏覽器出廠時,已經自帶大量公認的根證書機構證書信息。 因此還是購買有效的根證書機構簽發(fā)的證書吧。不貴。
實現備忘
1、HTTPS默認是443端口
? ? HTTPS是一個應用層協議,和HTTP同一等級,因此它有默認端口443。
? ? 所以,不要想當然以為https會訪問80端口。
2、https訪問速度慢于http
? ?由于存在事前協商、加密等工作,因此https的訪問速度是要慢于http。這也是安全性帶來的性能消耗。
? ?當然,在這個時代,這點速度消耗基本可以忽略。
3、http 可以通過反向代理的方式快速升級到https。
? ? ?目前apache、nginx都支持反向代理的方式將http網站升級到https。
? ? ?原理很簡單,apache或者nginx完成配置后,他們作為代理和客戶端完成加密通信,把解密后的內容和原始http通信。
? ? ?這種方式最大的好處是,原本的http網站不需要任何修改!
4、跨域情況下,https不能支持access-control-allow-origin:*
? ? ?http情況下,cors可以配置為access-control-allow-origin:*,一通百通。
? ? ?https情況下,不能使用通配符,需要指定具體的信息。當然,可以在反向代理中直接替換為請求頭的Origin。
5、fiefox對雙向認證支持不好。
? ?實測中發(fā)現,chrome可以比較好的支持雙向認證,firefox則存在一定兼容性問題。
尾聲
HTTPS經過多年推廣,終于已經比較成熟。證書機構、瀏覽器、web服務器都有相對比較完善的支持,成本也不高。
地址欄的小鎖對用戶來說,是巨大的安全感。建議網站可以考慮升級一下,大大提升用戶信任。