Wi-Fi del proveedor

Wi-Fi del operador es una función de conexión automática (con IMSI encriptado) disponible en Android 9 y versiones posteriores que permite que los dispositivos se conecten automáticamente a las redes de Wi-Fi implementadas por el operador. En áreas de alta congestión o cobertura celular mínima, como un estadio o una estación de tren subterránea, se puede usar el Wi-Fi del operador para mejorar la experiencia de conectividad de los usuarios y aliviar el tráfico.

Los dispositivos con la función de 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 de forma manual de una red Wi-Fi del operador, la red se incluye en la lista negra durante 24 horas (sin conexión automática). Los usuarios pueden conectarse manualmente a redes incluidas en la lista de entidades bloqueadas en cualquier momento.

Implementación

Los fabricantes de dispositivos y las empresas de telecomunicaciones deben hacer lo siguiente para implementar Wi-Fi de operador.

Fabricantes

En dispositivos con Android 11 y versiones posteriores, usa la API de sugerencias de Wi-Fi para agregar perfiles de Wi-Fi para cada operador.

Para dispositivos que ejecutan 10 o versiones anteriores, agrega perfiles de Wi-Fi configurando el parámetro carrier_wifi_string_array para cada operador en el administrador de configuración de operadores.

  • carrier_wifi_string_array: Es un array de cadenas en el que cada entrada de cadena es un SSID de Wi-Fi codificado en base64 y un tipo de EAP separados por una coma, en el que el tipo de EAP es un número entero (consulta el registro del Protocolo de autenticación extensible (EAP)). Por ejemplo, la siguiente configuración es para SOME_SSID_NAME con EAP-AKA y Some_Other_SSID con EAP-SIM:

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

En el administrador de configuración del operador, configura los siguientes parámetros para cada operador:

  • imsi_key_availability_int: Identifica si la clave que se usa para la encriptación de IMSI está disponible para WLAN (se establece el bit 1), EPDG (se establece el bit 0) o ambos (se establecen el bit 0 y el bit 1). Por ejemplo, la siguiente configuración indica que la encriptación de IMSI está disponible para WLAN, pero no para EPDG:

    config {
      key: "imsi_key_availability_int"
      int_value: 2
    }
    
  • imsi_key_download_url_string: Es la URL desde la que se descarga el protocolo que contiene la clave pública del operador que se usa para la encriptación de 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: Es una marca que indica si se permite la descarga de la clave pública del operador a través de una red de uso medido (celular). Si no se establece esta marca, 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
    }
    

Operadores

Para implementar el Wi-Fi del operador, este debe habilitar la protección de la privacidad del IMSI y proporcionar una clave pública.

Protección de la privacidad del IMSI

Android protege la confidencialidad de la identidad permanente (IMSI) de un suscriptor con criptografía de clave pública. Android implementa la especificación de la Wireless Broadband Alliance (WBA) para la protección de la privacidad del IMSI para Wi-Fi. Cuando la protección de la privacidad del IMSI está habilitada para una conexión, la identidad del suscriptor permanente no se transmite de forma clara por aire.

Encriptación de identidad permanente

El formato de la identidad permanente encriptada es el siguiente:

  • La identidad permanente tiene el formato <EAP-Method><IMSI>@<NAI realm>.
  • El prefijo EAP-Method es un octeto único que define el método EAP que se usa para la autenticación:
    • 0: EAP-AKA
    • 1: EAP-SIM
    • 6: EAP-AKA'
  • El formato de dominio NAI es wlan.mncXXX.mccYYY.3gppnetwork.org, en el que XXX se reemplaza por el código de red móvil (MNC) de la tarjeta SIM y YYY se reemplaza por el código de país móvil (MCC).
  • La identidad permanente se encripta con una clave pública RSA que proporciona el operador. La clave pública se incluye en un certificado X.509.
  • El esquema de encriptación es RSAES-OAEP con SHA-256 como la función hash criptográfica. Este esquema de encriptación garantiza un texto cifrado único cada vez que se usa, lo que evita otra identidad persistente que se pueda rastrear.
  • La longitud de la clave RSA es de 2,048 bits.
  • El búfer de encriptación es de 256 bytes.
  • El texto cifrado se codifica con Base64.
  • La longitud de la identidad permanente encriptada 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 opcional que el operador adjunta a un certificado para permitir que el servidor encuentre la clave privada adecuada durante la autenticación. Un ejemplo de un identificador de clave es CertificateSerialNumber=123456. Si se proporciona el identificador de clave, se envía de forma no encriptada como parte del proceso de autenticación.

Modificaciones en los métodos de autenticación EAP basados en SIM

Cuando la protección de la privacidad del IMSI está habilitada en una conexión, el sistema no envía la identidad permanente cuando recibe EAP-Request/Identity, sino que responde con un acceso 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 de EAP que se usa antes de que comience el intercambio de 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 usa una identidad encriptada o el tipo de método EAP que se configuró:

  • \0: Identidad permanente encriptada
  • 0: EAP-AKA
  • 1: EAP-SIM
  • 6: EAP-AKA'

El par clave-valor del atributo identificador es opcional y no se agrega al final de la identidad permanente encriptada si no se usa.

En este punto, el servidor ubica la clave privada del identificador de claves (si se proporciona), desencripta la identidad encriptada con la clave privada del operador y continúa el flujo normal de EAP.

Cuando la autenticación se realiza correctamente, el servidor puede proporcionar una identidad de re-autenticación rápida o una identidad temporal (pseudónimo), que se usa en las conexiones posteriores. Si el servidor no proporciona identidades temporales, el sistema envía la identidad encriptada 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, este usa la URL proporcionada en la configuración del operador imsi_key_download_url_string para descargar un certificado con el método HTTP GET. El sistema usa 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 descargará el certificado solo cuando haya una conexión Wi-Fi disponible.

El sistema aplica el vencimiento de los certificados. El sistema comienza a intentar renovar los certificados 21 días antes de la fecha de vencimiento y usa la misma URL para descargar el certificado nuevo.

En caso de que el servidor no pueda desencriptar la identidad encriptada, 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 se revoque o venza, el servidor envía un mensaje EAP-Request/AKA-Notification con el código AT_NOTIFICATION Certificate Replacement Required (16385) para finalizar el intercambio de EAP. En respuesta, el sistema aplica heurísticas internas para determinar si se debe quitar el certificado y, luego, intentar descargar uno nuevo desde la misma URL.

Proporciona la clave pública

Proporciona una URL pública a un servidor, preferiblemente con HTTP sobre TLS, que aloje el certificado del operador en el que se cumpla lo siguiente:

  1. La clave pública y el vencimiento se pueden extraer del certificado.
  2. 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-----"
    } ]
    }