電信業者 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-SIM 的 EAP-AKA 和 Some_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-AKA1
:EAP-SIM6
:EAP-AKA'
- NAI 領域格式為
wlan.mncXXX.mccYYY.3gppnetwork.org
,其中 已使用 SIM 卡的行動網路代碼 (MNC) 取代XXX
,YYY
為 替換成行動裝置國家/地區代碼 (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-AKA1
:EAP-SIM6
: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-AKA1
:EAP-SIM6
: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), 請提供通訊業者憑證:
- 您可以從憑證中擷取公開金鑰和到期日。
伺服器提供的資訊會採用 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-----" } ] }