Il Wi-Fi dell'operatore è una funzionalità di connessione automatica (che utilizza l'IMSI criptato) disponibile in Android 9 e versioni successive che consente ai dispositivi di connettersi automaticamente alle reti Wi-Fi implementate dall'operatore. Nelle aree con elevata congestione o con copertura cellulare minima, come uno stadio o una stazione ferroviaria sotterranea, il Wi-Fi dell'operatore può migliorare l'esperienza di connettività degli utenti e scaricare il traffico.
I dispositivi con la funzionalità Wi-Fi dell'operatore si connettono automaticamente alle reti Wi-Fi dell'operatore configurate (reti con un certificato di chiave pubblica). Quando un utente si disconnette manualmente da una rete Wi-Fi dell'operatore, la rete viene inserita nella lista bloccata per 24 ore (nessuna connessione automatica). Gli utenti possono connettersi manualmente alle reti inserite nella lista bloccata in qualsiasi momento.
Implementazione
I produttori di dispositivi e gli operatori devono eseguire le seguenti operazioni per implementare il Wi-Fi dell'operatore.
Produttori
Per i dispositivi con Android 11 e versioni successive, utilizza l' API di suggerimento Wi-Fi per aggiungere profili Wi-Fi per ogni operatore.
Per i dispositivi con Android 10 o versioni precedenti, aggiungi i profili Wi-Fi configurando il carrier_wifi_string_array parametro per ogni operatore nel
gestore di configurazione dell'operatore.
carrier_wifi_string_array:Un array di stringhe in cui ogni voce di stringa è un SSID Wi-Fi con codifica Base64 e un tipo EAP separati da una virgola, dove il tipo EAP è un numero intero (consulta il registro Extensible Authentication Protocol (EAP)). Ad esempio, la seguente configurazione è per SOME_SSID_NAME che utilizza EAP-AKA e Some_Other_SSID che utilizza EAP-SIM:
config { key: "carrier_wifi_string_array" text_array { item: "U09NRV9TU0lEX05BTUUK,23" item: "U29tZV9PdGhlcl9TU0lECg==,18" } }
Nel gestore di configurazione dell'operatore, configura i seguenti parametri per ogni operatore:
imsi_key_availability_int:Indica se la chiave utilizzata per la crittografia IMSI è disponibile per WLAN (bit 1 impostato), EPDG (bit 0 impostato) o entrambi (bit 0 e bit 1 impostati). Ad esempio, la seguente configurazione indica che la crittografia IMSI è disponibile per WLAN, ma non per EPDG:
config { key: "imsi_key_availability_int" int_value: 2 }imsi_key_download_url_string:URL da cui viene scaricato il proto contenente la chiave pubblica dell'operatore utilizzata per la crittografia IMSI. Ad esempio, la seguente configurazione fornisce un URL specifico:
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: un flag che indica se consentire il download della chiave pubblica dell'operatore su una rete a consumo (cellulare). Se questo flag non è impostato, un nuovo dispositivo senza connettività Wi-Fi non potrà connettersi alla rete Wi-Fi dell'operatore perché non sarà autorizzato a scaricare la chiave.config { key: "allow_metered_network_for_cert_download_bool" bool_value: true }
Operatori
Per implementare il Wi-Fi dell'operatore, l'operatore deve attivare la protezione della privacy IMSI e fornire una chiave pubblica.
Protezione della privacy IMSI
Android protegge la riservatezza dell'identità permanente di un abbonato (IMSI) utilizzando la crittografia con chiave pubblica. Android implementa la specifica della Wireless Broadband Alliance (WBA) per la protezione della privacy IMSI per il Wi-Fi. Quando la protezione della privacy IMSI è attivata per una connessione, l'identità permanente dell'abbonato non viene trasmessa in chiaro via etere.
Crittografia dell'identità permanente
Il formato dell'identità permanente criptata è il seguente:
- L'identità permanente è nel formato di
<EAP-Method><IMSI>@<NAI realm>. - Il prefisso EAP-Method è un singolo ottetto che definisce il metodo EAP utilizzato per l'autenticazione:
0: EAP-AKA1: EAP-SIM6: EAP-AKA'
- Il formato del realm NAI è
wlan.mnc<var>XXX</var>.mcc<var>YYY</var>.3gppnetwork.orgdoveXXXè sostituito con il Mobile Network Code (MNC) della scheda SIM eYYYè sostituito con il Mobile Country Code (MCC). - L'identità permanente viene criptata utilizzando una chiave pubblica RSA fornita dall'operatore. La chiave pubblica è inclusa in un certificato X.509.
- Lo schema di crittografia è RSAES-OAEP con SHA-256 come funzione hash crittografica. Questo schema di crittografia garantisce un testo cifrato univoco ogni volta che viene utilizzato, evitando così un'altra identità persistente che può essere monitorata.
- La lunghezza della chiave RSA è di 2048 bit.
- Il buffer di crittografia è di 256 byte.
- Il testo cifrato è codificato con Base64.
- La lunghezza dell'identità permanente criptata di output è di 344 byte.
Encrypted Permanent Identity = Base64(RSAES-OAEP-SHA-256(<EAP-Method><IMSI>@<NAI Realm>))
Identificatore chiave
L'identificatore chiave è una coppia di valori di attributi facoltativa che l'operatore associa a un certificato per consentire al server di individuare la chiave privata corretta durante l'autenticazione. Un esempio di identificatore chiave è CertificateSerialNumber=123456. Se viene fornito l'identificatore chiave, viene inviato in chiaro come parte della procedura di autenticazione.
Modifiche ai metodi di autenticazione EAP basati su SIM
Quando la protezione della privacy IMSI è attivata su una connessione, il sistema non invia l'identità permanente alla ricezione di EAP-Request/Identity, ma risponde con un accesso anonimo:
SERVER: EAP-Request/Identity
UE: EAP-Response/Identity AT_IDENTITY=<prefix>|anonymous@<NAI Realm>
<prefix> è facoltativo. Se la configurazione dell'operatore enable_eap_method_prefix_bool è impostata su true, il primo carattere dell'identità (prima di anonymous) comunica al server il tipo di metodo EAP utilizzato prima dell'inizio dello scambio EAP.
0: EAP-AKA1: EAP-SIM6: EAP-AKA'
Se la configurazione dell'operatore è impostata su false, questo prefisso non è incluso nel messaggio.
In risposta, il server invia un messaggio EAP-Request/AKA-Identity e il sistema risponde nel seguente formato:
SERVER: EAP-Request/AKA-Identity AT_ANY_ID_REQ
UE: EAP-Response/AKA-Identity AT_IDENTITY=<prefix>|<Encrypted Permanent Identity>|","|"<attribute>=<value>"
Il primo carattere dell'identità comunica al server se viene utilizzata un'identità criptata o il tipo di metodo EAP configurato:
\0: identità permanente criptata0: EAP-AKA1: EAP-SIM6: EAP-AKA'
La coppia di valori di attributi dell'identificatore chiave è facoltativa e non viene aggiunta alla fine dell'identità permanente criptata se non è in uso.
A questo punto, il server individua la chiave privata dall'identificatore chiave (se fornito), decripta l'identità criptata utilizzando la chiave privata dell'operatore e continua il normale flusso EAP.
Dopo l'autenticazione riuscita, il server può fornire un'identità di riautenticazione rapida o un'identità temporanea (pseudonimo), che viene utilizzata nelle connessioni successive. Se il server non fornisce identità temporanee, il sistema invia l'identità criptata nella connessione successiva.
Recupero, scadenza e revoca del certificato dell'operatore
Se nel sistema non è installato alcun certificato, il sistema utilizza l'URL fornito nella configurazione dell'operatore imsi_key_download_url_string per scaricare un certificato utilizzando il metodo Get HTTP. Il sistema utilizza i dati cellulari solo se la configurazione dell'operatore allow_metered_network_for_cert_download_bool è impostata su true. In caso contrario, il sistema scarica il certificato solo quando è disponibile una connessione Wi-Fi.
La scadenza del certificato viene applicata dal sistema. Il sistema inizia a tentare di rinnovare i certificati 21 giorni prima della data di scadenza del certificato e utilizza lo stesso URL per scaricare il nuovo certificato.
Se il server non riesce a decriptare l'identità criptata, invia un messaggio EAP-Request/AKA-Notification con il codice AT_NOTIFICATION General Failure (16384) per terminare lo scambio EAP.
Se il certificato viene revocato o scade, il server invia un messaggio EAP-Request/AKA-Notification con il codice AT_NOTIFICATION Certificate Replacement Required (16385) per terminare lo scambio EAP. In risposta, il sistema applica l'euristica interna per determinare se rimuovere il certificato e tentare di scaricare un nuovo certificato dallo stesso URL.
Fornire la chiave pubblica
Fornisci un URL pubblico a un server, preferibilmente utilizzando HTTP su TLS, che ospita il certificato dell'operatore in cui:
- La chiave pubblica e la scadenza possono essere estratte dal certificato.
Le informazioni del server sono in formato JSON come segue:
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.Di seguito è riportato un esempio di chiave pubblica.
{ "carrier-keys" : [ { "key-identifier" : "CertificateSerialNumber=5xxe06d4", "public-key" : "-----BEGIN CERTIFICATE-----\r\nTIIDRTCCAi2gAwIBAgIEVR4G1DANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJVUzELMAkGA1UE\r\nCBMCTkExCzAJBgNVBAcTAk5BMQswCQYDVQQKEwJOQTELMAkGA1UECxMCTkExEDAOBgNVBAMTB1Rl\r\nc3RiT6N1/w==\r\n-----END CERTIFICATE-----" } ] }