Wi-Fi operatora to funkcja automatycznego łączenia (z użyciem zaszyfrowanego numeru IMSI) dostępna w Androidzie 9 i nowszych wersjach, która umożliwia urządzeniom automatyczne łączenie się z sieciami Wi-Fi wdrożonymi przez operatorów. W miejscach o dużym natężeniu ruchu lub minimalnym zasięgu sieci komórkowej, takich jak stadion czy stacja metra, Wi-Fi operatora może poprawić łączność użytkowników i odciążyć sieć.
Urządzenia z funkcją Wi-Fi operatora automatycznie łączą się ze skonfigurowanymi sieciami Wi-Fi operatora (sieciami z certyfikatem klucza publicznego). Gdy użytkownik ręcznie rozłączy się z siecią Wi-Fi operatora, sieć zostanie dodana do listy zablokowanych na 24 godziny (bez automatycznego łączenia). Użytkownicy mogą w dowolnym momencie ręcznie połączyć się z sieciami znajdującymi się na liście zablokowanych.
Implementacja
Aby wdrożyć Wi-Fi operatora, producenci urządzeń i operatorzy muszą wykonać te czynności.
Producenci
W przypadku urządzeń z Androidem 11 lub nowszym użyj interfejsu Wi-Fi suggestion API, aby dodać profile Wi-Fi dla każdego operatora.
W przypadku urządzeń z Androidem 10 lub starszym dodaj profile Wi-Fi, konfigurując parametr carrier_wifi_string_array dla każdego operatora w menedżerze konfiguracji operatora.
- carrier_wifi_string_array:- Tablica ciągów znaków, w której każdy ciąg znaków to zakodowany w Base64 identyfikator SSID sieci Wi-Fi i typ EAP rozdzielone przecinkiem. Typ EAP jest liczbą całkowitą (patrz Extensible Authentication Protocol (EAP) Registry). Na przykład poniższa konfiguracja dotyczy sieci SOME_SSID_NAME z użyciem EAP-AKA i sieci Some_Other_SSID z użyciem EAP-SIM: - config { key: "carrier_wifi_string_array" text_array { item: "U09NRV9TU0lEX05BTUUK,23" item: "U29tZV9PdGhlcl9TU0lECg==,18" } }
W menedżerze konfiguracji operatora skonfiguruj te parametry dla każdego operatora:
- imsi_key_availability_int:- Określa, czy klucz używany do szyfrowania IMSI jest dostępny w przypadku sieci WLAN (ustawiony jest bit 10), EPDG (ustawiony jest bit 0) lub obu tych sieci (ustawione są zarówno bit 0, jak i bit 1). Na przykład ta konfiguracja wskazuje, że szyfrowanie IMSI jest dostępne w przypadku sieci WLAN, ale nie w przypadku EPDG: - config { key: "imsi_key_availability_int" int_value: 2 }
- imsi_key_download_url_string:- Adres URL, z którego pobierany jest protokół zawierający klucz publiczny operatora używany do szyfrowania IMSI. Na przykład ta konfiguracja udostępnia konkretny adres URL: - 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: flaga wskazująca, czy zezwalać na pobieranie klucza publicznego operatora w sieci komórkowej. Jeśli ten flag nie jest ustawiony, nowe urządzenie bez łączności Wi-Fi nie będzie mogło połączyć się z siecią Wi-Fi operatora, ponieważ nie będzie mogło pobrać klucza.- config { key: "allow_metered_network_for_cert_download_bool" bool_value: true }
Operatorzy
Aby wdrożyć Wi-Fi operatora, musi on włączyć ochronę prywatności IMSI i udostępnić klucz publiczny.
Ochrona prywatności IMSI
Android chroni poufność stałego identyfikatora abonenta (IMSI) za pomocą kryptografii klucza publicznego. Android wdraża specyfikację Wireless Broadband Alliance (WBA) dotyczącą ochrony prywatności IMSI w przypadku Wi-Fi. Gdy ochrona prywatności IMSI jest włączona w przypadku połączenia, stały identyfikator abonenta nie jest przesyłany w postaci niezaszyfrowanej drogą radiową.
Szyfrowanie stałej tożsamości
Format zaszyfrowanej trwałej tożsamości jest następujący:
- Stały identyfikator ma format <EAP-Method><IMSI>@<NAI realm>.
- Prefiks EAP-Method to pojedynczy oktet, który określa metodę EAP używaną do uwierzytelniania:- 0: EAP-AKA
- 1: EAP-SIM
- 6: EAP-AKA'
 
- Format domeny NAI to wlan.mnc<var>XXX</var>.mcc<var>YYY</var>.3gppnetwork.org, gdzieXXXjest zastępowany kodem sieci komórkowej (MNC) karty SIM, aYYYjest zastępowany kodem kraju (MCC).
- Trwały identyfikator jest szyfrowany przy użyciu klucza publicznego RSA dostarczonego przez operatora. Klucz publiczny jest zawarty w certyfikacie X.509.
- Schemat szyfrowania to RSAES-OAEP z SHA-256 jako kryptograficzną funkcją skrótu. Ten schemat szyfrowania gwarantuje unikalny tekst zaszyfrowany za każdym razem, gdy jest używany, co pozwala uniknąć kolejnego trwałego identyfikatora, który można śledzić.
- Długość klucza RSA wynosi 2048 bitów.
- Bufor szyfrowania ma 256 bajtów.
- Szyfrogram jest zakodowany w formacie Base64.
- Długość zaszyfrowanego trwałego identyfikatora wyjściowego wynosi 344 bajty.
Encrypted Permanent Identity = Base64(RSAES-OAEP-SHA-256(<EAP-Method><IMSI>@<NAI Realm>))
Identyfikator klucza
Identyfikator klucza to opcjonalna para atrybutów i wartości, którą operator dołącza do certyfikatu, aby umożliwić serwerowi zlokalizowanie odpowiedniego klucza prywatnego podczas uwierzytelniania. Przykładem identyfikatora klucza jest CertificateSerialNumber=123456. Jeśli identyfikator klucza jest podany, jest wysyłany
w postaci jawnej w ramach procesu uwierzytelniania.
Zmiany w metodach uwierzytelniania EAP opartych na karcie SIM
Gdy ochrona prywatności IMSI jest włączona w przypadku połączenia, system nie wysyła stałego identyfikatora po otrzymaniu EAP-Request/Identity, ale odpowiada anonimowym logowaniem:
SERVER: EAP-Request/Identity
UE: EAP-Response/Identity AT_IDENTITY=<prefix>|anonymous@<NAI Realm>
Opcjonalny składnik to <prefix>. Jeśli konfiguracja operatora enable_eap_method_prefix_bool jest ustawiona na true, pierwszy znak tożsamości (przed anonymous) informuje serwer o typie używanej metody EAP przed rozpoczęciem wymiany EAP.
- 0: EAP-AKA
- 1: EAP-SIM
- 6: EAP-AKA'
Jeśli konfiguracja operatora jest ustawiona na false, ten prefiks nie jest uwzględniany w wiadomości.
W odpowiedzi serwer wysyła komunikat EAP-Request/AKA-Identity, a system odpowiada w tym formacie:
SERVER: EAP-Request/AKA-Identity AT_ANY_ID_REQ
UE: EAP-Response/AKA-Identity AT_IDENTITY=<prefix>|<Encrypted Permanent Identity>|","|"<attribute>=<value>"
Pierwszy znak tożsamości informuje serwer o tym, czy używana jest zaszyfrowana tożsamość, czy też o typie skonfigurowanej metody EAP:
- \0: zaszyfrowana tożsamość trwała
- 0: EAP-AKA
- 1: EAP-SIM
- 6: EAP-AKA'
Para atrybutów identyfikatora klucza jest opcjonalna i nie jest dołączana na końcu zaszyfrowanego trwałego identyfikatora, jeśli nie jest używana.
W tym momencie serwer lokalizuje klucz prywatny na podstawie identyfikatora klucza (jeśli został podany), odszyfrowuje zaszyfrowaną tożsamość za pomocą klucza prywatnego operatora i kontynuuje normalny proces EAP.
Po pomyślnym uwierzytelnieniu serwer może udostępnić tożsamość umożliwiającą szybkie ponowne uwierzytelnianie lub tożsamość tymczasową (pseudonim), która jest używana w kolejnych połączeniach. Jeśli serwer nie udostępni tymczasowych tożsamości, system wyśle zaszyfrowaną tożsamość w kolejnym połączeniu.
Pobieranie, wygasanie i unieważnianie certyfikatów operatora
Jeśli w systemie nie ma zainstalowanego certyfikatu, system używa adresu URL podanego w imsi_key_download_url_string konfiguracji operatora, aby pobrać certyfikat za pomocą metody HTTP GET. System korzysta z komórkowej transmisji danych tylko wtedy, gdy allow_metered_network_for_cert_download_bool konfiguracja operatora jest ustawionatrue na true. W przeciwnym razie system pobierze certyfikat tylko wtedy, gdy będzie dostępne połączenie Wi-Fi.
Wygaśnięcie certyfikatu jest wymuszane przez system. System rozpoczyna próby odnowienia certyfikatów 21 dni przed datą wygaśnięcia certyfikatu i używa tego samego adresu URL do pobrania nowego certyfikatu.
Jeśli serwer nie może odszyfrować zaszyfrowanej tożsamości, wysyła komunikat EAP-Request/AKA-Notification z kodem AT_NOTIFICATIONGeneral Failure (16384), aby zakończyć wymianę EAP.
Jeśli certyfikat zostanie unieważniony lub wygaśnie, serwer wyśle komunikat z kodem AT_NOTIFICATIONCertificate Replacement Required (16385), aby zakończyć wymianę EAP.EAP-Request/AKA-Notification W odpowiedzi system stosuje wewnętrzne heurystyki, aby określić, czy usunąć certyfikat i spróbować pobrać nowy certyfikat z tego samego adresu URL.
Podaj klucz publiczny
Podaj publiczny adres URL serwera, najlepiej z użyciem protokołu HTTP over TLS, który hostuje certyfikat operatora, gdzie:
- Klucz publiczny i datę ważności można wyodrębnić z certyfikatu.
- Informacje z serwera są w formacie 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.- Poniżej znajdziesz przykład klucza publicznego. - { "carrier-keys" : [ { "key-identifier" : "CertificateSerialNumber=5xxe06d4", "public-key" : "-----BEGIN CERTIFICATE-----\r\nTIIDRTCCAi2gAwIBAgIEVR4G1DANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJVUzELMAkGA1UE\r\nCBMCTkExCzAJBgNVBAcTAk5BMQswCQYDVQQKEwJOQTELMAkGA1UECxMCTkExEDAOBgNVBAMTB1Rl\r\nc3RiT6N1/w==\r\n-----END CERTIFICATE-----" } ] }