電信業者 Wi-Fi

電信業者 Wi-Fi 是自動連線功能 (使用加密 IMSI), Android 9 以上版本 可讓裝置自動連線至電信業者提供的 Wi-Fi 更是如此處於壅塞或基地最微弱的區域,例如: 像是體育場館或地下火車站 使用電信業者 Wi-Fi 提升網路品質 使用者並卸載流量

支援電信業者 Wi-Fi 功能的裝置會自動連線到 已設定電信業者 Wi-Fi 網路 (具備公用金鑰憑證的網路)。時間 使用者手動中斷與電信業者 Wi-Fi 網路的連線 列入黑名單 24 小時 (沒有自動連線)。使用者可以手動連線至 一律列入黑名單

如果裝置搭載 Android 9 以上版本,且已導入電信業者 Wi-Fi, 透過電信業者 Wi-Fi 自動連線的功能預設為關閉。通知 裝置嘗試連接電信業者 Wi-Fi 時傳送給使用者 首次與這個網路平台通訊

實作

裝置製造商和電信業者必須按照下列步驟導入電信業者 。

製造商

如果是搭載 Android 11 以上版本的裝置,請使用 Wi-Fi Suggestion API 為每個電信業者新增 Wi-Fi 設定檔。

針對搭載 10 以下版本的裝置,請按照下列步驟新增 Wi-Fi 設定檔: 為每個電信業者設定 carrier_wifi_string_array 參數 電信業者設定管理員

  • carrier_wifi_string_array: 一個字串陣列,其中每個字串項目是採用 Base64 編碼的 Wi-Fi SSID 和 EAP 類型 (以半形逗號分隔),其中 EAP 類型為整數 (請參閱 加強式驗證通訊協定 (EAP) 註冊系統)。 舉例來說,下列設定適用於 SOME_SSID_NAME,並採用 使用 EAP-SIMEAP-AKASome_Other_SSID

    config {
      key: "carrier_wifi_string_array"
      text_array {
        item: "U09NRV9TU0lEX05BTUUK,23"
        item: "U29tZV9PdGhlcl9TU0lECg==,18"
      }
    }
    

電信業者設定管理員 為各家電信業者設定下列參數:

  • imsi_key_availability_int: 指出 WLAN 是否可用於 IMSI 加密的金鑰 (已設定 位元 1)、EPDG (已設定 位元 0),或兩者皆有 (位元 0 和位元 1 皆有) 設定)。舉例來說,下列設定表示 IMSI WLAN 提供加密功能,但 EPDG 無法使用:

    config {
      key: "imsi_key_availability_int"
      int_value: 2
    }
    
  • imsi_key_download_url_string: 包含電信業者公開金鑰的 proto 網址 已下載 IMSI 加密。例如下列設定 會提供特定網址:

    config {
      key: "imsi_key_download_url_string"
      text_value: "https://www.some_company_name.com:5555/some_directory_name/some_filename.json"
    }
    
  • allow_metered_network_for_cert_download_bool:指示是否採用 允許透過計量付費 (行動網路)。如未設定這個標記,表示沒有 Wi-Fi 的新裝置 就無法連上電信業者 Wi-Fi 網路 就無法下載金鑰。

    config {
      key: "allow_metered_network_for_cert_download_bool"
      bool_value: true
    }
    

電信業者

如要導入電信業者 Wi-Fi,電信業者必須啟用 IMSI 隱私保護服務, 請提供公開金鑰

IMSI 隱私權保護

Android 會保護訂閱者的永久身分 (IMSI) 的機密性 使用公開金鑰密碼編譯。Android 實作無線寬頻 IMSI Privacy Protection for Wi-Fi 聯盟 (WBA) 規格。 連線啟用 IMSI 隱私保護服務後, 並不會以公開的方式傳輸自己的訂閱者身分

永久身分加密

經過加密的永久身分格式如下:

  • 永久身分的格式為 <EAP-Method><IMSI>@<NAI realm>
  • EAP-Method 前置字元是單一八位元,用於定義 用於驗證:
    • 0:EAP-AKA
    • 1:EAP-SIM
    • 6:EAP-AKA'
  • NAI 領域格式為 wlan.mncXXX.mccYYY.3gppnetwork.org,其中 已使用 SIM 卡的行動網路代碼 (MNC) 取代 XXXYYY 為 替換成行動裝置國家/地區代碼 (MCC)。
  • 永久身分會使用 再來是貨運公司公開金鑰包含在 X.509 憑證。
  • 加密配置為 RSAES-OAEP 做為加密編譯雜湊函式的 SHA-256。這項加密機制 在每次使用配置時保證不重複的加密文字,因此可避免 又是可以追蹤的其他永久身分
  • RSA 金鑰的長度為 2048 位元。
  • 加密緩衝區為 256 個位元組。
  • 加密文字使用 Base64
  • 輸出內容已加密的永久身分長度為 344 個位元組。
Encrypted Permanent Identity = Base64(RSAES-OAEP-SHA-256(<EAP-Method><IMSI>@<NAI Realm>))
金鑰 ID

金鑰 ID 是電信業者連接的選填屬性值組合 新增至憑證,讓伺服器可在 驗證。金鑰 ID 的範例如下 CertificateSerialNumber=123456。如果提供金鑰 ID,該金鑰 ID 就會傳送 清楚說明程序

修改 SIM 卡式 EAP 驗證方法

如果在連線上啟用 IMSI 隱私保護服務,系統不會傳送 是永久身分,因為收到的是 EAP-Request/Identity 會以匿名登入方式回應:

SERVER: EAP-Request/Identity
UE: EAP-Response/Identity AT_IDENTITY=<prefix>|anonymous@<NAI Realm>

<prefix> 為選用項目,如果「enable_eap_method_prefix_bool」電信業者 設定設為 true,也就是身分的第一個字元 (之前 anonymous) 會在 EAP 交換作業隨即開始。

  • 0:EAP-AKA
  • 1:EAP-SIM
  • 6:EAP-AKA'

如果將電信業者設定設為「false」,這個前置字元就不會納入 訊息。

伺服器會在回應中傳送 EAP-Request/AKA-Identity 訊息, 系統會以下列格式回應:

SERVER: EAP-Request/AKA-Identity AT_ANY_ID_REQ
UE: EAP-Response/AKA-Identity AT_IDENTITY=<prefix>|<Encrypted Permanent Identity>|","|"<attribute>=<value>"

識別的第一個字元會向伺服器通知伺服器 身分或設定的 EAP 方法類型

  • \0:加密的永久身分
  • 0:EAP-AKA
  • 1:EAP-SIM
  • 6:EAP-AKA'
,瞭解如何調查及移除這項存取權。

鍵 ID 屬性值組合為選用項目,不會附加至 並終止加密的永久身分。

此時,伺服器會從金鑰 ID 尋找私密金鑰 (如果 使用電信業者的私密金鑰解密已加密的身分,以及 繼續執行正常 EAP 流程。

成功驗證後,伺服器可提供 能夠快速重新驗證身分或暫時身分 (匿名), 常用於後續連線如果 伺服器時,系統會在後續連線中傳送已加密的身分。

電信業者憑證檢索、有效期限與撤銷

如果系統中未安裝憑證,系統會使用 「imsi_key_download_url_string」電信業者設定中提供的網址 使用 HTTP GET 方法下載憑證系統將使用行動數據連線 僅限「allow_metered_network_for_cert_download_bool」電信業者 設定設為 true否則,系統會下載憑證 可連上 Wi-Fi 時。

憑證到期日由系統強制執行。系統開始嘗試 並在憑證到期日的 21 天前更新憑證,並使用 下載新憑證。

如果伺服器無法解密已加密的身分,則伺服器 傳送含有 AT_NOTIFICATION 代碼的 EAP-Request/AKA-Notification 訊息 General Failure (16384) 可終止 EAP 交換。

在憑證遭到撤銷或過期的情況下,伺服器會傳送 含有 AT_NOTIFICATION 驗證碼的 EAP-Request/AKA-Notification 訊息 Certificate Replacement Required (16385) 可終止 EAP 交換。 為回應,系統會運用內部經驗法則,判定是否要 並嘗試從相同憑證 網址。

提供公開金鑰

為伺服器提供公開網址 (建議使用 HTTP 而非 TLS), 請提供通訊業者憑證:

  1. 您可以從憑證中擷取公開金鑰和到期日。
  2. 伺服器提供的資訊會採用 JSON 格式,如下所示:

    Property: key-identifier
    Type: String
    Encoding: UTF-8
    Description: Specifies an identifier that the carrier would like to attach to the certificate.
    Optional: Yes
    
    Property: certificate
    Property alternative name: public-key
    Type: String
    Encoding: Base64
    Description: The content of the carrier's X.509 certificate.
    Optional: No
    
    Property: key-type
    Type: String
    Encoding: UTF-8
    Description: Specifies the module that will use the key. The value for type must be either WLAN or EPDG.
    Optional: Yes. If the key-type property isn't included, then its value defaults to WLAN.
    

    以下是公開金鑰的範例。

    {
    "carrier-keys" : [ {
      "key-identifier" : "CertificateSerialNumber=5xxe06d4",
      "public-key" : "-----BEGIN CERTIFICATE-----\r\nTIIDRTCCAi2gAwIBAgIEVR4G1DANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJVUzELMAkGA1UE\r\nCBMCTkExCzAJBgNVBAcTAk5BMQswCQYDVQQKEwJOQTELMAkGA1UECxMCTkExEDAOBgNVBAMTB1Rl\r\nc3RiT6N1/w==\r\n-----END CERTIFICATE-----"
    } ]
    }