Wi-Fi operatora

Wi-Fi operatora to funkcja automatycznego łączenia (z wykorzystaniem zaszyfrowanego protokołu IMSI) dostępna na Androidzie 9 i nowszych, która pozwala urządzeniom automatycznie łączyć się z sieciami Wi-Fi wdrożonymi przez operatora. W obszarach o wysokim natężeniu ruchu lub minimalnym zasięgu komórkowym, takich jak stadiony czy stacje metra, można korzystać z Wi-Fi operatora, aby poprawić jakość połączeń użytkowników i odciążyć sieć.

Urządzenia obsługujące Wi-Fi operatora automatycznie łączą się ze skonfigurowanymi sieciami Wi-Fi operatora (sieci z certyfikatem klucza publicznego). Gdy użytkownik ręcznie rozłączy się z siecią Wi-Fi operatora, sieć jest na czarnej liście na 24 godziny (brak połączenia automatycznego). Użytkownicy mogą w dowolnym momencie ręcznie łączyć się z sieciami na liście zablokowanych.

Implementacja

Aby wdrożyć Wi-Fi przez operatora, producenci urządzeń i operatorzy muszą wykonać te czynności.

Producenci

W przypadku urządzeń z Androidem 11 lub nowszym użyj interfejsu API sugestii Wi-Fi, aby dodać profile Wi-Fi dla każdego operatora.

W przypadku urządzeń z systemem Android 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ągu znaków, w której każdy ciąg znaków to identyfikator SSID sieci Wi-Fi zakodowany w standardzie Base64 i typ EAP rozdzielone przecinkami. Typ EAP to liczba całkowita (patrz Regisible Authentication Protocol (EAP)). Na przykład poniższa konfiguracja dotyczy SOME_SSID_NAME, która używa EAP-AKA, i Some_Other_SSID, która używa EAP-SIM:

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

W Menedżerze konfiguracji operatora skonfiguruj dla każdego operatora te parametry:

  • imsi_key_availability_int: określa, czy klucz używany do szyfrowania IMSI jest dostępny dla WLAN (bit 1 jest ustawiony), EPDG (bit 0 jest ustawiony) lub obu (zarówno bit 0, jak i bit 1 są ustawione). Na przykład ta konfiguracja wskazuje, że szyfrowanie IMSI jest dostępne w przypadku 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 taka konfiguracja zapewnia 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 pobieranie klucza publicznego operatora ma być dozwolone w ramach sieci taryfowej (komórkowej). Jeśli ten parametr nie jest ustawiony, nowe urządzenie bez połączenia 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ć sieć Wi-Fi operatora, operator musi włączyć ochronę prywatności IMSI i podać klucz publiczny.

Ochrona prywatności IMSI

Android chroni poufność stałej tożsamości abonenta (IMSI) za pomocą kryptografii klucza publicznego. Android wdraża specyfikację Wireless Broadband Alliance (WBA) dotyczącą ochrony prywatności IMSI w sieci Wi-Fi. Gdy ochrona prywatności IMSI jest włączona w przypadku połączenia, stała tożsamość subskrybenta nie jest przesyłana w pełnej treści w sieci bezprzewodowej.

Stałe szyfrowanie tożsamości

Format zaszyfrowanej tożsamości jest następujący:

  • Trwała tożsamość ma format <EAP-Method><IMSI>@<NAI realm>.
  • Prefiks metody EAP to pojedynczy oktet definiujący metodę EAP używaną do uwierzytelniania:
    • 0: EAP-AKA
    • 1: EAP-SIM
    • 6: EAP-AKA'
  • Format domeny NAI to: wlan.mncXXX.mccYYY.3gppnetwork.org, gdzie XXX zastępuje kod sieci komórkowej karty SIM (MNC), a YYY zastępuje kod kraju sieci komórkowej (MCC).
  • Stała tożsamość jest szyfrowana przy użyciu klucza publicznego RSA udostępnionego przez operatora. Klucz publiczny jest zawarty w certyfikacie X.509.
  • Schemat szyfrowania to RSAES-OAEP z SHA-256 jako funkcją kryptograficznego haszowania. Ten schemat szyfrowania gwarantuje unikalny tekst szyfrowany przy każdym użyciu schematu, co pozwala uniknąć kolejnej trwałej tożsamości, która może być śledzona.
  • Długość klucza RSA wynosi 2048 bitów.
  • Bufor szyfrowania ma rozmiar 256 bajtów.
  • Tekst szyfrowany jest kodowany w formacie Base64.
  • Długość zaszyfrowanej trwałej tożsamości na wyjściu to 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 znalezienie odpowiedniego klucza prywatnego podczas uwierzytelniania. Przykładem identyfikatora klucza jest CertificateSerialNumber=123456. Jeśli podany zostanie identyfikator klucza, zostanie on wysłany w postaci zwykłego tekstu w ramach procesu uwierzytelniania.

Modyfikacje metod uwierzytelniania EAP na podstawie karty SIM

Gdy ochrona prywatności IMSI jest włączona w połączeniu, system nie wysyła stałej tożsamości po otrzymaniu EAP-Request/Identity, ale odpowiada anonimowym logowaniem:

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

<prefix> jest opcjonalny. 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 wiadomość EAP-Request/AKA-Identity, a system odpowiada w takim 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, że używana jest zaszyfrowana tożsamość lub że skonfigurowano metodę EAP:

  • \0: zaszyfrowana stała tożsamość
  • 0: EAP-AKA
  • 1: EAP-SIM
  • 6: EAP-AKA'

Para klucz-wartość atrybutu jest opcjonalna i nie jest dołączana do zaszyfrowanej tożsamości trwałej, jeśli nie jest używana.

Na tym etapie serwer lokalizuje klucz prywatny z identyfikatora klucza (jeśli został podany), odszyfrowuje zaszyfrowaną tożsamość za pomocą klucza prywatnego operatora i kontynuuje zwykły proces EAP.

Po pomyślnym uwierzytelnieniu serwer może udostępnić tożsamość do szybkiego ponownego uwierzytelniania lub tożsamość tymczasową (pseudonim), która będzie używana w kolejnych połączeniach. Jeśli serwer nie udostępnia tymczasowych tożsamości, system wysyła zaszyfrowaną tożsamość w kolejnych połączeniach.

Pobieranie, wygaśnięcie i unieważnienie certyfikatu przewoźnika

Jeśli w systemie nie ma zainstalowanego certyfikatu, system pobiera certyfikat za pomocą metody HTTP GET, korzystając z adresu URL podanego w konfiguracji operatora imsi_key_download_url_string. System korzysta z komórkowej transmisji danych tylko wtedy, gdy konfiguracja operatora allow_metered_network_for_cert_download_bool jest ustawiona 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 zaczyna próbować odnawiać certyfikaty 21 dni przed datą ich wygaśnięcia i używa tego samego adresu URL do pobrania nowego certyfikatu.

Jeśli serwer nie może odszyfrować zaszyfrowanej tożsamości, wysyła wiadomość EAP-Request/AKA-Notification z kodem AT_NOTIFICATION General Failure (16384), aby zakończyć wymianę EAP.

Jeśli certyfikat został cofnięty lub wygasł, serwer wysyła wiadomość EAP-Request/AKA-Notification z kodem AT_NOTIFICATION Certificate Replacement Required (16385), aby zakończyć wymianę EAP. W odpowiedzi na to system zastosuje wewnętrzną heurystykę, aby określić, czy usunąć certyfikat i spróbować pobrać nowy certyfikat z tego samego adresu URL.

Podanie klucza publicznego

Podaj publiczny adres URL serwera, najlepiej za pomocą HTTP przez TLS, który obsługuje certyfikat operatora, gdzie:

  1. Klucz publiczny i termin ważności można wyodrębnić z certyfikatu.
  2. Informacje z serwera mają następujący format 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-----"
    } ]
    }