Android 11 如何不要驗證 Wi-Fi CA 憑證

文章目錄

注意
  1. 系統刷機有一定的風險, 可能導致手機無法開機和失去保固, 資料還會被清空, 執行前請先三思!!!
  2. 此方法適用於 Android 11, 12. 還沒在 Android 13 上測試

本文更新紀錄

  1. 2022/05/30: 新增系統更新或 Wi-Fi 密碼修改後的處理方式

Wi-Fi CA 憑證驗證在 Android 11 的改變

Android 10 以前, 如果是連到 Enterprise Wi-Fi (EAP/PEAP), CA 憑證是可以選 "不要驗證", 如下:

自 Android 11 起, 如果是連到 Enterprise Wi-Fi (PEAP), CA 憑證就無法選 "不要驗證", 原因可參考 https://www.xda-developers.com/android-11-break-enterprise-wifi-connection/. 這個方向是對的, 但如果網管不改, 一般使用者恐怕也無能為力. (而且 iPhone 至少到 15.4 都沒有卡這個...)

爬了一下文, 看來是可以直接把這個設定加回去 (參考: https://android.stackexchange.com/questions/231859/), 但很不幸的, 檔案是放在 /data/misc/apexdata/com.android.wifi/WifiConfigStore.xm, 這裡的檔案必須 Unlock 才能修改. 文章裡面是寫有可能透過 App 修改, 但我沒找到方法, 如果有人找到好方法了, 也麻煩分享一下.

修改步驟

  1. 首先, 要 Unlock, Pixel 5 (Android 12) 可參考 https://dennys.github.io/tw/doc/android/google-pixel-5-root-magisk/. (要做到把 boot.img 換掉, Magisk 不需要裝)

  2. 試著連上 Wi-Fi, 網域就隨便給他寫, 然後試著連線, 這當然是不會成功, 目的只是要把帳號密碼寫進 Config 檔案.

  3. 先用下列指令檢查 WifiConfigStore.xml 是否正確, 這裡也可以用 adb pull 拉到電腦檢查, 但我一直沒成功, 就先用 cat 看.

    1adb shell
    2su
    3cat /data/misc/apexdata/com.android.wifi/WifiConfigStore.xml
    
    1. 若執行 su 時發生 inaccessible or not found (如下圖), 通常是 root 沒成功, 請再確認一次 root 步驟.
      1127|redfin:/system/bin $ su
      2/system/bin/sh: su: inaccessible or not found
      
  4. 讀出來的 WifiConfigStore.xml 內容如下, 可找 WifiEnterpriseConfiguration 這個關鍵字, 目的是要把 12,13 行的設定值清掉

     1<WifiEnterpriseConfiguration>
     2<string name="Identity">這裡是帳號名字</string>
     3<string name="AnonIdentity"></string>
     4<string name="Password">這裡是密碼</string>
     5<string name="ClientCert"></string>
     6<string name="CaCert"></string>
     7<string name="SubjectMatch"></string>
     8<string name="Engine">0</string>
     9<string name="EngineId"></string>
    10<string name="PrivateKeyId"></string>
    11<string name="AltSubjectMatch"></string>
    12<string name="DomSuffixMatch">這裡是上面隨便輸入的網域</string>
    13<string name="CaPath">/system/etc/security/cacerts</string>
    14<int name="EapMethod" value="0" />
    15<int name="Phase2Method" value="4" />
    16<string name="PLMN"></string>
    17<string name="Realm"></string>
    18<int name="Ocsp" value="0" />
    19<string name="WapiCertSuite"></string>
    20<boolean name="AppInstalledRootCaCert" value="false" />
    21<boolean name="AppInstalledPrivateKey" value="false" />
    22<null name="KeyChainAlias" />
    23<null name="DecoratedIdentityPrefix" />
    24</WifiEnterpriseConfiguration>
    
  5. 執行以下指令 (這指令是直接從上面那篇 stackexchange 抄過來的), 他就會把 CaPathDomSuffixMatch 的內容改成空白. 最後一個步驟會重開, 要重開才會生效.

    1adb shell
    2su
    3sed -i 's%<string name="CaPath">.*</string>%<string name="CaPath"></string>%' /data/misc/apexdata/com.android.wifi/WifiConfigStore.xml
    4sed -i 's%<string name="DomSuffixMatch">.*</string>%<string name="DomSuffixMatch"></string>%' /data/misc/apexdata/com.android.wifi/WifiConfigStore.xml
    5reboot
    
  6. 重開完後, 檢查 /data/misc/apexdata/com.android.wifi/WifiConfigStore.xml 的內容, 確認下面 12~13 列的設定被清空了

     1<WifiEnterpriseConfiguration>
     2<string name="Identity">這裡是帳號名字</string>
     3<string name="AnonIdentity"></string>
     4<string name="Password">這裡是密碼</string>
     5<string name="ClientCert"></string>
     6<string name="CaCert"></string>
     7<string name="SubjectMatch"></string>
     8<string name="Engine">0</string>
     9<string name="EngineId"></string>
    10<string name="PrivateKeyId"></string>
    11<string name="AltSubjectMatch"></string>
    12<string name="DomSuffixMatch"></string>
    13<string name="CaPath"></string>
    14<int name="EapMethod" value="0" />
    15<int name="Phase2Method" value="4" />
    16<string name="PLMN"></string>
    17<string name="Realm"></string>
    18<int name="Ocsp" value="0" />
    19<string name="WapiCertSuite"></string>
    20<boolean name="AppInstalledRootCaCert" value="false" />
    21<boolean name="AppInstalledPrivateKey" value="false" />
    22<null name="KeyChainAlias" />
    23<null name="DecoratedIdentityPrefix" />
    24</WifiEnterpriseConfiguration>
    
  7. 這時候就可以測試連線了

  8. 因為實際上並不需要 root, 我們的目的是要修改 WifiConfigStore.xml, 因此改完後可以 UnRoot (移除 Magisk 和刷回原廠 boot.img), 但因為解鎖會清空資料, 而且下次又遇到新的 Wi-Fi 又得重來, 我就維持解鎖狀態了. 方法可參考 https://dennys.github.io/tw/doc/android/android-remove-root-magisk/

系統更新後如何處理?

不用處理, 至少目前我的 Pixel 5 更新到 2022 年 5 月更新 (12.1.0 (SP2A.220505.002, May 2022) 時, 都不需要處理.

Wi-Fi 密碼更新後如何處理?

  1. 如果系統有更新過, 就得先用 Magisk 重新 patch 一次.
  2. 一樣要試著連線一次 (當然也是不會成功), 重點是要把新密碼寫進 WifiConfigStore.xml.
  3. 然後再用 adb shell 跑一次上面的 sed 指令修改 WifiConfigStore.xml 即可.

後記

這個方法並不是把不要驗證 (Do Not Validate) 的設定加回去, 而是先嘗試連線一個要驗證的 Wi-Fi (當然這裡會失敗), 等他把設定檔存下來之後, 再進系統把憑證的設定改掉, 所以還是和 Android 10 以前不太一樣. 而且 每次連上一個新的要使用 EAP 的 Wi-Fi 基地台都要重新執行一次, 還是比較麻煩.

Posts in this Series