標籤:

?? 也談 HTTPS - HTTPDNS + HTTPS

最近談論 HTTPS 的文章很多,其原因之一是運營商作惡底線越來越低,動不動就插播廣告, 前兩天小米還聯合幾家公司發文 關於抵制流量劫持等違法行為的聯合聲明 痛斥某些運營商。 另一方面也是蘋果 ATS 政策的大力推動,逼迫大家在 APP 中全部使用 HTTPS 通信。 上 HTTPS 的好處很多:保護用戶的數據不外泄,避免中間人篡改數據, 對企業信息進行鑒權。

關於 HTTPS 如何購買證書,如何部署,網上的教程已經太多了,實踐起來沒有太大的難處。 我們在部署 HTTPS 的時候,遇到了一些新問題,首當其衝的就是 HTTPS 部分網路不可訪問的問題:

儘管使用了 HTTPS 技術,部分邪惡的運營商,仍然使用 DNS 污染技術,讓域名指向的他們自己伺服器 而這些伺服器並沒有部署 SSL 服務(就算部署了,也會觸發 SSL 證書 Common name 不一致報警), 導致 443 埠直接被拒絕。

這個問題不解決,強行上 HTTPS 的話,會導致一部分用戶出現無法訪問網站 一旦用戶不爽了,輕則對產品不信任,重則直接導致用戶流失。

運營商為了賺廣告錢、省網間結算是不擇手段的。 他們普遍使用的劫持手段是通過 ISP提供的 DNS 偽造域名。 那有沒有什麼方法可以解決 DNS 劫持呢? 業界有一套解決這類場景的方案,即 HTTPDNS。

HTTPDNS 的原理很簡單,將 DNS 這種容易被劫持的協議,轉為使用 HTTP 協議請求 Domain <-> IP 映射。 獲得正確 IP 之後,Client 自己組裝 HTTP 協議,從而避免 ISP 篡改數據。

via DNSPod

有兩篇文章很清晰的講解了 HTTPDNS 的細節:

  • 【鵝廠網事】全局精確流量調度新思路-HttpDNS服務詳解
    • 騰訊這篇文章時間點是 2014 年,說明這個方案上線更早,也較為成熟
  • DNS-over-HTTPS | Public DNS | Google Developers
    • 該方案更為先進,使用 HTTP 替換為 HTTPS,減少一個隱患點

點擊 dns.google.com/resolve? / 119.29.29.29/d? 感受一下 DNS-over-HTTPS / HTTPDNS。

單 IP 多域名支持

這個方案看似完美,但是在實際生產中,會遇到一個問題。

Android / iOS 在操作系統級別對 HTTPS 通信是提供了封裝。 APP 無法在發起連接時候,也沒有許可權直接操作 socket。 所以儘管 APP 拿到了域名對應的 IP,卻沒有辦法讓這個 IP 在 HTTPS 里生效。

解決的思路很暴力:徹底放棄域名系統,完全使用基於 IP 系統的通訊。

原本請求 duitang.com 的 request, 調整為請求 221.228.82.181

OK,做到這一步,我們就可以跟運營商劫持說拜拜了。

不,還沒結束。

完全搞定運營商之後,這 IP 方案給我們自己帶來一個困擾: Nginx 伺服器無法通過 Host 來識別不同域名下面的請求了!!! 在由於使用一個獨立 IP,會導致所有域名請求混在一起,無法分別。 大公司可以 dedicated IP,小公司就玩不起了。

為了解決同一個 IP 下面多個域名的問題,我們引入了一個URL參數: __domain。 當請求 IP 域名時候,必須帶著這個參數,伺服器會將請求域名解析出來,再分發到對應的域名。

實現這個邏輯的 Nginx 核心代碼:

set $query_domain $arg___domain;nif ($query_domain !~ (www|a|b).example.com) {n rewrite ^ http://www.example.com/404/ redirect;n}nset $my_host $query_domain;nlocation / {n proxy_set_header Host $my_host;n proxy_set_header X-REAL-IP $remote_addr;n proxy_pass http://127.0.0.1;n}n

最後一個注意事項是,記得調整 Nginx 配置的 remote_addr,否則都變成了 127.0.0.1, 也許會導致其他一些策略失效。

完美收工,效果如下:221.228.82.181/?

恭喜你,已經掌握核心科技了,再也不怕運營商瞎折騰了,從此走上了業務蓬勃發展的金光大道……??

下一篇文章,我會再談談如何做 HTTPS 的「內測」,避免將線上業務一次性切到 HTTPS 導致不少邊邊角角業務無法正常使用。

原文鏈接: blog.alswl.com/2016/11/

歡迎關注我的微信號:窺豹

3a1ff193cee606bd1e2ea554a16353ee
推薦閱讀:

如何評價 Chrome Android 不再選用 ChaCha20 作為首選演算法?
浙大博士在阿里:曾想低頭離開,沒想到一干就停不下來……
登陸所有網頁都是「此網站安全證書存在問題」的情況用https刪除後面的s這個方法解決是什麼原理?
部署SSL證書啟用HTTPS一周後的體驗總結

TAG:HTTPS | DNS |