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ò essere utilizzato per migliorare l'esperienza di connettività degli utenti e per 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 nera per 24 ore (nessuna connessione automatica). Gli utenti possono connettersi manualmente alle reti inserite nella lista nera in qualsiasi momento.
Implementazione
I produttori di dispositivi e gli operatori devono procedere come segue per implementare il Wi-Fi dell'operatore.
Produttori
Per i dispositivi con Android 11 e versioni successive, utilizza l'API per i suggerimenti 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 parametro carrier_wifi_string_array
per ogni operatore nel
gestore della configurazione dell'operatore.
carrier_wifi_string_array
: Un array di stringhe in cui ogni voce di stringa è un SSID Wi-Fi codificato in Base64 e un tipo EAP separato da una virgola, dove il tipo EAP è un numero intero (fai riferimento al 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" } }
In carrier config manager, configura i seguenti parametri per ogni operatore:
imsi_key_availability_int
: Indica se la chiave utilizzata per la crittografia IMSI è disponibile per la WLAN (bit 1 è impostato), EPDG (bit 0 è impostato) o entrambi (bit 0 e bit 1 sono impostati). Ad esempio, la seguente configurazione indica che la crittografia IMSI è disponibile per la 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 utilizzato 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, quest'ultimo 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 a 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 è abilitata per una connessione, l'identità dell'abbonato permanente non viene trasmessa in chiaro via etere.
Crittografia permanente dell'identità
Il formato dell'identità permanente criptata è il seguente:
- L'identità permanente è nel formato
<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.mncXXX.mccYYY.3gppnetwork.org
, doveXXX
viene sostituito con il codice di rete mobile (MNC) della scheda SIM eYYY
viene sostituito con il codice paese mobile (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 criptato è codificato con Base64.
- La lunghezza dell'identità permanente criptata dell'output è di 344 byte.
Encrypted Permanent Identity = Base64(RSAES-OAEP-SHA-256(<EAP-Method><IMSI>@<NAI Realm>))
Identificatore chiave
L'identificatore della chiave è una coppia di valori di attributo facoltativa che il corriere allega
a un certificato per consentire al server di individuare la chiave privata corretta durante
l'autenticazione. Un esempio di identificatore di chiave è
CertificateSerialNumber=123456
. Se viene fornito l'identificatore della chiave, questo viene inviato
in chiaro nell'ambito 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 al ricevimento 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 viene 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 dell'attributo identificatore di 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 della chiave (se fornito), decripta l'identità criptata utilizzando la chiave privata dell'operatore e continua il normale flusso EAP.
Una volta eseguita l'autenticazione, 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 dei certificati dell'operatore
Nel caso in cui non sia installato alcun certificato nel sistema, quest'ultimo utilizza l'URL fornito nella configurazione dell'operatore imsi_key_download_url_string
per scaricare un certificato utilizzando il metodo HTTP GET. Il sistema utilizza i dati mobili
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 è in grado di decriptare l'identità criptata, invia un messaggio EAP-Request/AKA-Notification
con il codice AT_NOTIFICATION
General Failure
(16384) per terminare lo scambio EAP.
Nel caso in cui il certificato venga revocato o scada, 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 euristiche interne per determinare se rimuovere il certificato e tentare di scaricarne uno nuovo dallo stesso URL.
Fornisci 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-----" } ] }