Wi-Fi da operadora

O Wi-Fi da operadora é um recurso de conexão automática (usando IMSI criptografado) disponível em Android 9 e versões mais recentes que permite que os dispositivos se conectem automaticamente ao Wi-Fi implementado pela operadora redes VPC. Em áreas de alto congestionamento ou com cobertura celular mínima, como em um estádio ou em uma estação de trem subterrânea, o Wi-Fi da operadora pode ser usado para melhorar dos usuários de conectividade e descarregar o tráfego.

Os dispositivos com o recurso Wi-Fi da operadora se conectam automaticamente redes Wi-Fi da operadora configuradas (redes com um certificado de chave pública). Quando um usuário se desconecta manualmente da rede Wi-Fi de uma operadora, a rede é na lista negra por 24 horas (sem conexão automática). Os usuários podem se conectar manualmente redes da lista negra a qualquer momento.

Em dispositivos com o Android 9 ou versões mais recentes com Wi-Fi da operadora implementado, a conexão automática pelo Wi-Fi da operadora fica desativada por padrão. Uma notificação é enviado ao usuário quando o dispositivo tenta se conectar ao Wi-Fi de uma operadora pela primeira vez.

Implementação

Os fabricantes de dispositivos e as operadoras precisam fazer o seguinte para implementar a operadora Wi-Fi.

Fabricantes

Para dispositivos com o Android 11 e versões mais recentes, use o API de sugestão de Wi-Fi para adicionar perfis de Wi-Fi para cada operadora.

Para dispositivos com até 10 dispositivos, adicione perfis de Wi-Fi por configurando o parâmetro carrier_wifi_string_array para cada operadora na gerenciador de configuração da operadora.

  • carrier_wifi_string_array: Uma matriz de strings em que cada entrada de string é um SSID do Wi-Fi codificado em Base64 e um tipo de EAP separado por uma vírgula, em que o tipo de EAP é um número inteiro (consulte registro do protocolo de autenticação extensível (EAP)). Por exemplo, a configuração a seguir é para SOME_SSID_NAME usando o EAP-AKA e Some_Other_SSID usando EAP-SIM:

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

Na gerenciador de configuração da operadora, configure os seguintes parâmetros para cada operadora:

  • imsi_key_availability_int: Identifica se a chave usada para criptografia IMSI está disponível para WLAN (o bit 1 está definido), EPDG (o bit 0 está definido) ou ambos (o bit 0 e o bit 1 são definido). Por exemplo, a configuração a seguir indica que o IMSI a criptografia está disponível para WLAN, mas não para EPDG:

    config {
      key: "imsi_key_availability_int"
      int_value: 2
    }
    
  • imsi_key_download_url_string: URL do qual o proto que contém a chave pública da operadora usada para O download da criptografia IMSI foi concluído. Por exemplo, a seguinte configuração fornece um URL específico:

    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: uma sinalização que indica se para permitir o download da chave pública da operadora por um rede celular. Se o flag não for definido, um novo dispositivo sem Wi-Fi não poderão se conectar à rede Wi-Fi da operadora porque não será possível fazer o download da chave.

    config {
      key: "allow_metered_network_for_cert_download_bool"
      bool_value: true
    }
    

Operadoras

Para implementar o Wi-Fi da operadora, a operadora precisa ativar a proteção de privacidade IMSI e fornecer uma chave pública.

Proteção de privacidade IMSI

O Android protege a confidencialidade da identidade permanente (IMSI, na sigla em inglês) de um assinante usando criptografia de chave pública. O Android implementa a banda larga sem fio Especificação da Alliance (WBA) para Proteção de privacidade IMSI para Wi-Fi (link em inglês). Quando a proteção de privacidade IMSI está ativada para uma conexão, a a identidade do assinante não é transmitida no ar.

Criptografia de identidade permanente

O formato da identidade permanente criptografada é o seguinte:

  • A identidade permanente está no formato <EAP-Method><IMSI>@<NAI realm>.
  • O prefixo EAP-Method é um octeto único que define o método EAP que é usada para a autenticação:
    • 0: EAP-AKA
    • 1: EAP-SIM
    • 6: EAP-AKA'
  • O formato de domínio NAI é wlan.mncXXX.mccYYY.3gppnetwork.org em que XXX é substituído pelo código de rede móvel (MNC) do chip, e YYY é pelo código de país para dispositivos móveis (MCC).
  • A identidade permanente é criptografada com uma chave pública RSA fornecida pelo a operadora. A chave pública está incluída em um X.509.
  • O esquema de criptografia é RSAES-OAEP (em inglês) usando o SHA-256 como a função hash criptográfica. Esse esquema de criptografia garante um texto criptografado exclusivo sempre que o esquema é usado, evitando assim mais uma identidade persistente que pode ser rastreada.
  • O comprimento da Chave RSA é de 2.048 bits.
  • O buffer de criptografia tem 256 bytes.
  • O texto criptografado é codificado com Base64 (link em inglês).
  • O comprimento da identidade permanente criptografada de saída é de 344 bytes.
Encrypted Permanent Identity = Base64(RSAES-OAEP-SHA-256(<EAP-Method><IMSI>@<NAI Realm>))
Identificador de chaves

O identificador de chave é um par de valor de atributo opcional que a operadora anexa a um certificado para permitir que o servidor localize a chave privada adequada durante autenticação. Um exemplo de identificador de chave é CertificateSerialNumber=123456: Se o identificador de chave for fornecido, ele será enviado como parte do processo de autenticação.

Modificações nos métodos de autenticação EAP baseados em chip

Quando a proteção de privacidade IMSI está ativada em uma conexão, o sistema não envia a identidade permanente após o recebimento de EAP-Request/Identity, em vez disso responde com um login anônimo:

SERVER: EAP-Request/Identity
UE: EAP-Response/Identity AT_IDENTITY=<prefix>|anonymous@<NAI Realm>

<prefix> é opcional. Se a operadora enable_eap_method_prefix_bool é definida como true, o primeiro caractere da identidade (antes anonymous) notifica o servidor sobre o tipo de método EAP usado antes do A troca EAP é iniciada.

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

Se a configuração da operadora estiver definida como false, esse prefixo não será incluído no a mensagem.

Em resposta, o servidor envia uma mensagem EAP-Request/AKA-Identity e a sistema responde no seguinte formato:

SERVER: EAP-Request/AKA-Identity AT_ANY_ID_REQ
UE: EAP-Response/AKA-Identity AT_IDENTITY=<prefix>|<Encrypted Permanent Identity>|","|"<attribute>=<value>"

O primeiro caractere da identidade notifica o servidor que um endereço IP ou o tipo de método EAP configurado:

  • \0: identidade permanente criptografada
  • 0: EAP-AKA
  • 1: EAP-SIM
  • 6: EAP-AKA'
.

O par de valor e atributo do identificador de chave é opcional e não é anexado ao fim da identidade permanente criptografada se não estiver em uso.

Neste ponto, o servidor localiza a chave privada a partir do identificador de chave (se fornecido), descriptografa a identidade criptografada usando a chave privada da operadora. continua o fluxo de EAP normal.

Após a autenticação bem-sucedida, o servidor pode fornecer uma identidade de reautenticação rápida ou uma identidade temporária (pseudônimo), que é usadas em conexões posteriores. Se nenhuma identidade temporária for fornecida pelo servidor, o sistema envia a identidade criptografada na conexão subsequente.

Recuperação, expiração e revogação de certificados da operadora

Quando nenhum certificado estiver instalado no sistema, o sistema usará a URL fornecido na configuração da operadora imsi_key_download_url_string para fazer o download de um certificado usando o método HTTP GET. O sistema usa dados móveis apenas se a operadora allow_metered_network_for_cert_download_bool é definida como true. Caso contrário, o sistema fará o download do certificado. apenas quando uma conexão Wi-Fi estiver disponível.

A expiração do certificado é aplicada pelo sistema. O sistema começa a tentar os certificados são renovados 21 dias antes da data de validade, e usa o mesmo URL para fazer o download do novo certificado.

Caso o servidor não consiga descriptografar a identidade, ele envia uma mensagem EAP-Request/AKA-Notification com o código AT_NOTIFICATION; General Failure (16384) para encerrar a troca EAP.

Caso o certificado seja revogado ou tenha expirado, o servidor enviará uma Mensagem EAP-Request/AKA-Notification com o código AT_NOTIFICATION Certificate Replacement Required (16385) para encerrar a troca EAP. Em resposta, o sistema aplica heurística interna para determinar remover o certificado e tentar fazer download de um novo certificado do mesmo URL.

Informe a chave pública

Forneça um URL público para um servidor, de preferência usando HTTP sobre TLS, que hospeda o certificado da transportadora em que:

  1. A chave pública e a expiração podem ser extraídas do certificado.
  2. As informações do servidor estão no formato JSON, da seguinte maneira:

    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.
    

    Veja a seguir um exemplo de chave pública.

    {
    "carrier-keys" : [ {
      "key-identifier" : "CertificateSerialNumber=5xxe06d4",
      "public-key" : "-----BEGIN CERTIFICATE-----\r\nTIIDRTCCAi2gAwIBAgIEVR4G1DANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJVUzELMAkGA1UE\r\nCBMCTkExCzAJBgNVBAcTAk5BMQswCQYDVQQKEwJOQTELMAkGA1UECxMCTkExEDAOBgNVBAMTB1Rl\r\nc3RiT6N1/w==\r\n-----END CERTIFICATE-----"
    } ]
    }