讓 iOS 裝置可以存取自訂 domain

近幾年行動裝置的瀏覽量佔比有愈來愈高的趨勢,身為 web 工程師也得朝著 mobile first 的方向做調整優化,所以在不同行動裝置上做測試也在所難免,為了避免 key 錯 ip、方便記憶,多數的專案也都採用 private domain 的做法,因此不可能為了 iOS 裝置測試方便就調整不同服務間的 connection string,想了幾種方式最後還是搬出老方法 - 透過某台開發環境的電腦架設 proxy server 來處理

iOS 沒有 hosts file 可以設定,同事說可以透過 jb 來設定,我沒有實際用過,留給大家自行嘗試看看囉

基本環境說明

  1. macOS Catalina 10.15.1
  2. iOS 13.3
  3. docker 19.03.5
  4. Mitmproxy 5
  5. 在內網中使用自訂 domain :yowko.test

    開發環境透過修改 etc/hosts,將 yowko.test 指向特定內網 ip 獲取服務,iOS 不認得自訂 domain

    19cannotaccess

設定方式

  1. 使用 Mitmproxy 在電腦上建立 proxy server

    這邊可以使用其他工具 (過去在 Windows 平台,我多是使用 fiddler 詳細資訊可以參考之前筆記 使用fiddler 內建proxy 來截錄手機或是程式封包,因為 mac 使用 fiddler 需要透過 mono 以方便性來看不是首選)

    • 透過 homebrew 安裝

      • 安裝指令

        brew install mitmproxy
        
      • 啟動 Mitmproxy

        • 僅啟動 proxy server

          mitmproxy
          

          畫面會顯示出所有 proxy 經手的資訊

          1mitmproxy

        • 啟動 proxy server 及 web ui

          會一併啟動 proxy server

          mitmweb
          

          有 web ui 顯示出所有 proxy 經手的資訊

          2mitmweb

          3mitmweb2

    • 使用 docker

      其他使用方式,請參考 dockerhub - mitmproxy/mitmproxy,預設 mitmproxy 會使用 stdout 輸出資訊,如果使用 -d daemon 模式啟動, container 啟動完成就會直接 shutdown 了

      docker run --rm -it -p 8080:8080 mitmproxy/mitmproxy
      
  2. 將 iOS 裝連上與電腦共用的 wifi,並設定 proxy server 指向裝設 mitmproxy 的電腦 ip

    5wifi)

    6proxyserver

    7proxyip

  3. 已可正常存取自訂 domain

    8yowkotest

  4. 無法連線 https 網頁或是 apple 服務 (optional)

    雖然可以正常存取自訂 domain,但部份服務卻出現異常,主要是因為 mitmproxy 無法正確轉導 https 內容,此時可以透過信依 mitmproxy 憑證解決問題,或是裝置只在自訂 domain 測試使用,需要其他服務時停用 proxy

    9httpsfail

    • 在 iOS 上使用 Safari 連線至 http://mitm.it 下載並安裝 Mitmproxy 用憑證

      一定要透過 Safari 開啟網頁,否則無法進行安裝

      10mitmit

      11download

      12downloaded

    • 設定 –> 一般 –> 描述檔

      13description

      14mitmdesc

      15install

      15-1warning

      16installed

    • 設定 –> 一般 –> 關於本機 –> 憑證信任設定

      啟用根憑證完整信任

      17roottrust

      18alerttrust

心得

這招是以前跟寫 app 的同事合作時常用來 debug 的方法,想不到過這麼多年了還是相當受用,非常感謝當年同事的指導

說實話我不清楚這個做法是不是最好,甚至是不是正確的,不過以結果來看的確可以解決當下的問題,提供大家參考,也請大家指教其他做法

參考資訊

  1. mitmproxy
  2. mitmproxy/mitmproxy