Carrier Wi-Fi es una función de conexión automática (que utiliza IMSI cifrado) disponible en Android 9 y versiones posteriores que permite que los dispositivos se conecten automáticamente a redes Wi-Fi implementadas por el operador. En áreas de alta congestión o con cobertura celular mínima, como un estadio o una estación de tren subterráneo, se puede utilizar Wi-Fi de operador para mejorar la experiencia de conectividad de los usuarios y aliviar el tráfico.
Los dispositivos con la función Wi-Fi del operador se conectan automáticamente a las redes Wi-Fi del operador configuradas (redes con un certificado de clave pública). Cuando un usuario se desconecta manualmente de la red Wi-Fi de un proveedor, la red aparece en la lista negra durante 24 horas (sin conexión automática). Los usuarios pueden conectarse manualmente a redes incluidas en la lista negra en cualquier momento.
En dispositivos con Android 9 o superior con Wi-Fi del operador implementado, la conexión automática a través de Wi-Fi del operador está desactivada de forma predeterminada. Se envía una notificación al usuario cuando el dispositivo intenta conectarse a la red Wi-Fi de un proveedor por primera vez.
Implementación
Los fabricantes de dispositivos y los operadores deben hacer lo siguiente para implementar Wi-Fi del operador.
Fabricantes
Para dispositivos con Android 11 y versiones posteriores, use la API de sugerencias de Wi-Fi para agregar perfiles de Wi-Fi para cada operador.
Para dispositivos con versión 10 o inferior, agregue perfiles de Wi-Fi configurando el parámetro carrier_wifi_string_array
para cada operador en el administrador de configuración del operador .
carrier_wifi_string_array
: una matriz de cadenas donde cada entrada de cadena es un SSID de Wi-Fi codificado en Base64 y un tipo de EAP separado por una coma, donde el tipo de EAP es un número entero (consulte el Registro del Protocolo de autenticación extensible (EAP) ). Por ejemplo, la siguiente configuración es para SOME_SSID_NAME usando EAP-AKA y Some_Other_SSID usando EAP-SIM :config { key: "carrier_wifi_string_array" text_array { item: "U09NRV9TU0lEX05BTUUK,23" item: "U29tZV9PdGhlcl9TU0lECg==,18" } }
En el administrador de configuración del operador , configure los siguientes parámetros para cada operador:
imsi_key_availability_int
: Identifica si la clave utilizada para el cifrado IMSI está disponible para WLAN (el bit 1 está configurado), EPDG (el bit 0 está configurado) o ambos (el bit 0 y el bit 1 están configurados). Por ejemplo, la siguiente configuración indica que el cifrado IMSI está disponible para WLAN pero no para EPDG:config { key: "imsi_key_availability_int" int_value: 2 }
imsi_key_download_url_string
: URL desde la que se descarga el protocolo que contiene la clave pública del operador utilizado para el cifrado IMSI. Por ejemplo, la siguiente configuración proporciona una URL específica: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 indicador que indica si se permite la descarga de la clave pública del operador a través de una red (celular) medida. Si esta bandera no está configurada, un dispositivo nuevo sin conectividad Wi-Fi no podrá conectarse a la red Wi-Fi del operador porque no podrá descargar la clave.config { key: "allow_metered_network_for_cert_download_bool" bool_value: true }
Transportistas
Para implementar Wi-Fi del operador, el operador debe habilitar la protección de privacidad IMSI y proporcionar una clave pública.
Protección de privacidad IMSI
Android protege la confidencialidad de la identidad permanente de un suscriptor (IMSI) mediante criptografía de clave pública. Android implementa la especificación Wireless Broadband Alliance (WBA) para la protección de privacidad IMSI para Wi-Fi . Cuando la protección de privacidad IMSI está habilitada para una conexión, la identidad permanente del suscriptor no se transmite de forma clara por aire.
Cifrado de identidad permanente
El formato de la identidad permanente cifrada es el siguiente:
- La identidad permanente tiene el formato
<EAP-Method><IMSI>@<NAI realm>
. - El prefijo del método EAP es un octeto único que define el método EAP que se utiliza para la autenticación:
-
0
: EAP-AKA -
1
: EAP-SIM -
6
: EAP-AKA'
-
- El formato del reino NAI es
wlan.mnc XXX .mcc YYY .3gppnetwork.org
dondeXXX
se reemplaza con el código de red móvil (MNC) de la tarjeta SIM yYYY
se reemplaza con el código de país móvil (MCC). - La identidad permanente se cifra mediante una clave pública RSA proporcionada por el operador. La clave pública está incluida en un certificado X.509 .
- El esquema de cifrado es RSAES-OAEP con SHA-256 como función hash criptográfica. Este esquema de cifrado garantiza un texto cifrado único cada vez que se utiliza el esquema, evitando así otra identidad persistente que pueda ser rastreada.
- La longitud de la clave RSA es de 2048 bits.
- El búfer de cifrado es de 256 bytes.
- El texto cifrado está codificado con Base64 .
- La longitud de la identidad permanente cifrada de salida es de 344 bytes.
Encrypted Permanent Identity = Base64(RSAES-OAEP-SHA-256(<EAP-Method><IMSI>@<NAI Realm>))
Identificador de clave
El identificador de clave es un par de valores de atributos opcionales que el operador adjunta a un certificado para permitir que el servidor localice la clave privada adecuada durante la autenticación. Un ejemplo de identificador de clave es CertificateSerialNumber=123456
. Si se proporciona el identificador de clave, se envía sin cifrar como parte del proceso de autenticación.
Modificaciones a los métodos de autenticación EAP basados en SIM
Cuando la protección de privacidad IMSI está habilitada en una conexión, el sistema no envía la identidad permanente al recibir EAP-Request/Identity
, sino que responde con un inicio de sesión anónimo:
SERVER: EAP-Request/Identity
UE: EAP-Response/Identity AT_IDENTITY=<prefix>|anonymous@<NAI Realm>
<prefix>
es opcional. Si la configuración del operador enable_eap_method_prefix_bool
se establece en true
, el primer carácter de la identidad (antes de anonymous
) notifica al servidor sobre el tipo de método EAP utilizado antes de que comience el intercambio EAP.
-
0
: EAP-AKA -
1
: EAP-SIM -
6
: EAP-AKA'
Si la configuración del operador está establecida en false
, este prefijo no se incluye en el mensaje.
En respuesta, el servidor envía un mensaje EAP-Request/AKA-Identity
y el sistema responde en el siguiente formato:
SERVER: EAP-Request/AKA-Identity AT_ANY_ID_REQ
UE: EAP-Response/AKA-Identity AT_IDENTITY=<prefix>|<Encrypted Permanent Identity>|","|"<attribute>=<value>"
El primer carácter de la identidad notifica al servidor que se utiliza una identidad cifrada o el tipo de método EAP que está configurado:
-
\0
: Identidad permanente cifrada -
0
: EAP-AKA -
1
: EAP-SIM -
6
: EAP-AKA'
El par de valores del atributo del identificador de clave es opcional y no se agrega al final de la identidad permanente cifrada si no está en uso.
En este punto, el servidor localiza la clave privada del identificador de clave (si se proporciona), descifra la identidad cifrada utilizando la clave privada del operador y continúa el flujo EAP normal.
Tras una autenticación exitosa, el servidor puede proporcionar una identidad de reautenticación rápida o una identidad temporal (seudónimo), que se utiliza en conexiones posteriores. Si el servidor no proporciona identidades temporales, el sistema envía la identidad cifrada en la conexión posterior.
Recuperación, vencimiento y revocación de certificados de operador
En el caso de que no haya ningún certificado instalado en el sistema, el sistema utiliza la URL proporcionada en la configuración del operador imsi_key_download_url_string
para descargar un certificado utilizando el método HTTP GET. El sistema utiliza datos móviles solo si la configuración del operador allow_metered_network_for_cert_download_bool
está establecida en true
. De lo contrario, el sistema descarga el certificado solo cuando hay una conexión Wi-Fi disponible.
El sistema aplica la caducidad del certificado. El sistema comienza a intentar renovar los certificados 21 días antes de la fecha de vencimiento del certificado y utiliza la misma URL para descargar el nuevo certificado.
En caso de que el servidor no pueda descifrar la identidad cifrada, envía un mensaje EAP-Request/AKA-Notification
con el código AT_NOTIFICATION
General Failure
(16384) para finalizar el intercambio de EAP.
En el caso de que el certificado sea revocado o caduque, el servidor envía un mensaje EAP-Request/AKA-Notification
con el código AT_NOTIFICATION
Certificate Replacement Required
(16385) para finalizar el intercambio EAP. En respuesta, el sistema aplica heurística interna para determinar si se debe eliminar el certificado e intentar descargar un nuevo certificado desde la misma URL.
Proporcionar la clave pública
Proporcione una URL pública a un servidor, preferiblemente usando HTTP sobre TLS, que aloje el certificado del operador donde:
- La clave pública y la caducidad se pueden extraer del certificado.
La información del servidor está en formato JSON de la siguiente manera:
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.
El siguiente es un ejemplo de una clave pública.
{ "carrier-keys" : [ { "key-identifier" : "CertificateSerialNumber=5xxe06d4", "public-key" : "-----BEGIN CERTIFICATE-----\r\nTIIDRTCCAi2gAwIBAgIEVR4G1DANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJVUzELMAkGA1UE\r\nCBMCTkExCzAJBgNVBAcTAk5BMQswCQYDVQQKEwJOQTELMAkGA1UECxMCTkExEDAOBgNVBAMTB1Rl\r\nc3RiT6N1/w==\r\n-----END CERTIFICATE-----" } ] }