Wi-Fi del proveedor

El 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 redes Wi-Fi implementadas por el operador redes. En áreas de alta congestión o con cobertura celular mínima, como una un estadio o una estación de tren subterránea, podrás usar el Wi-Fi del operador para mejorar de los usuarios la experiencia de conectividad de red y transferir el tráfico.

Los dispositivos con la función de Wi-Fi del operador se conectan automáticamente a redes Wi-Fi de operador configuradas (redes con un certificado de clave pública) Cuándo cuando un usuario se desconecta manualmente de la red Wi-Fi de un operador, la red en una lista negra por 24 horas (sin conexión automática). Los usuarios pueden conectarse manualmente a redes en la lista negra en cualquier momento.

En dispositivos que ejecutan Android 9 o versiones posteriores con Wi-Fi de operador implementado, La conexión automática mediante el Wi-Fi del operador está desactivada de forma predeterminada. Una notificación se envía al usuario cuando el dispositivo intenta conectarse a la red Wi-Fi de un operador red por primera vez.

Implementación

Los fabricantes y proveedores de dispositivos deben hacer lo siguiente para implementar el operador Wi-Fi

Fabricantes

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

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

  • carrier_wifi_string_array: 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 separado por una coma, donde el tipo de EAP es un número entero (consulta 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 la administrador de configuración del proveedor configura los siguientes parámetros para cada operador:

  • imsi_key_availability_int: Identifica si la clave utilizada para la encriptación IMSI está disponible para WLAN (bit 1 está configurado), EPDG (bit 0 está configurado) o ambos (tanto el bit 0 como el bit 1 son automático). Por ejemplo, la siguiente configuración indica que IMSI la encriptación está disponible para WLAN, pero no para EPDG:

    config {
      key: "imsi_key_availability_int"
      int_value: 2
    }
    
  • imsi_key_download_url_string: URL a partir del cual se muestra el proto que contiene la clave pública del operador que se usa para Se descargó la encriptación 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 para permitir la descarga de la clave pública del operador en una red (celular). Si no se establece esta marca, se muestra un dispositivo nuevo sin Wi-Fi. conectividad no podrá conectarse a la red Wi-Fi del operador porque no se podrá descargar la clave.

    config {
      key: "allow_metered_network_for_cert_download_bool"
      bool_value: true
    }
    

Operadores

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

Protección de la privacidad de IMSI

Android protege la confidencialidad de la identidad permanente de un suscriptor (IMSI) con criptografía de claves públicas. Android implementa la banda ancha inalámbrica Especificación de la alianza (WBA) para la Protección de la privacidad de IMSI para Wi-Fi. Cuando se habilita la protección de la privacidad de IMSI para una conexión, la la identidad del suscriptor no se transmite al aire libre.

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 del método EAP es un octeto único que define el método EAP que se que se usan para la autenticación:
    • 0: EAP-AKA
    • 1: EAP-SIM
    • 6: EAP-AKA
  • El formato de dominio NAI wlan.mncXXX.mccYYY.3gppnetwork.org donde Se reemplaza XXX por el código de red móvil (MNC) de la tarjeta SIM y se muestra YYY se reemplaza por el código móvil de país (MCC).
  • La identidad permanente se encripta con una clave pública RSA que proporciona la empresa de transporte. La clave pública se incluye en un X.509
  • El esquema de encriptación RSAES-OAEP con SHA-256 como la función hash de criptografía. Este esquema de encriptación garantiza un texto cifrado único cada vez que se usa el esquema, lo que evita es otra identidad persistente de la que se puede hacer un seguimiento.
  • La longitud de la clave RSA es de 2048 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 del resultado 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 atributo opcional que adjunta la empresa de transporte. a un certificado para que el servidor localice la clave privada apropiada durante la autenticación de varios factores. Un ejemplo de un identificador de clave es CertificateSerialNumber=123456 Si se proporciona el identificador de clave, se envía de forma clara 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 de IMSI está habilitada en una conexión, el sistema no envía la identidad permanente al recibir EAP-Request/Identity, en su lugar, 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 el proveedor enable_eap_method_prefix_bool está establecida en true, el primer carácter de la identidad (antes de anonymous) notifica al servidor sobre el tipo de método EAP utilizado antes del Comienza el intercambio de EAP.

  • 0: EAP-AKA
  • 1: EAP-SIM
  • 6: EAP-AKA

Si la configuración del proveedor se establece en false, este prefijo no se incluye en el mensaje.

En respuesta, el servidor envía un mensaje EAP-Request/AKA-Identity, y el 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 un identidad del usuario o el tipo de método de EAP que se configura:

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

El par de valor del atributo del identificador de clave es opcional y no se agrega al de la identidad permanente encriptada si no está en uso.

En este punto, el servidor localiza la clave privada a partir del identificador de clave (si proporcionada), desencripta la identidad encriptada usando la clave privada del operador y continúa con el flujo de EAP normal.

Tras una autenticación exitosa, el servidor puede proporcionar identidad de reautenticación rápida o una identidad temporal (seudónimo), que es usarse en conexiones posteriores. Si el equipo no proporciona identidades temporales servidor, el sistema envía la identidad cifrada en la conexión posterior.

Recuperación, vencimiento y revocación de certificados del proveedor

En caso de que no se instale un certificado en el sistema, este utiliza URL proporcionada en la configuración del proveedor imsi_key_download_url_string para descarga un certificado con el método HTTP GET. El sistema usa datos móviles. solo si el 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 del certificado. El sistema comienza a intentar renovar los certificados 21 días antes de la fecha de vencimiento del certificado y usa la misma URL para descargar el certificado nuevo.

En caso de que el servidor no pueda desencriptar la identidad cifrada, el servidor envía un mensaje EAP-Request/AKA-Notification con el código AT_NOTIFICATION General Failure (16384) para finalizar el intercambio de EAP.

En caso de que el certificado se revoque o caduque, el servidor enviará 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 una heurística interna para determinar si quitar el certificado e intentar descargar uno nuevo del mismo URL.

Proporciona la clave pública

Proporciona una URL pública a un servidor, preferentemente con HTTP sobre TLS, que aloje la certificado de la empresa de transporte en el que:

  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-----"
    } ]
    }