O Wi-Fi da operadora é um recurso de conexão automática (usando IMSI criptografado) disponível no Android 9 e versões mais recentes que permite que os dispositivos se conectem automaticamente a redes Wi-Fi implementadas pela operadora. Em áreas de alto congestionamento ou com cobertura celular mínima, como um estádio ou uma estação de trem subterrânea, o Wi-Fi da operadora pode melhorar a experiência de conectividade dos usuários e descarregar o tráfego.
Dispositivos com o recurso de Wi-Fi da operadora se conectam automaticamente a redes Wi-Fi configuradas da operadora (redes com um certificado de chave pública). Quando um usuário se desconecta manualmente de uma rede Wi-Fi da operadora, ela é colocada em uma lista de bloqueio por 24 horas (sem conexão automática). Os usuários podem se conectar manualmente a redes na lista de bloqueio a qualquer momento.
Implementação
Os fabricantes de dispositivos e as operadoras precisam fazer o seguinte para implementar o Wi-Fi da operadora.
Fabricantes
Para dispositivos com Android 11 e versões mais recentes, use a API Wi-Fi Suggestion para adicionar perfis de Wi-Fi para cada operadora.
Para dispositivos com Android 10 ou versões anteriores, adicione perfis de Wi-Fi
configurando o parâmetro carrier_wifi_string_array para cada operadora no
gerenciador de configuração da operadora.
- carrier_wifi_string_array:- Uma matriz de strings em que cada entrada de string é um SSID Wi-Fi codificado em Base64 e um tipo EAP separados por uma vírgula, em que o tipo EAP é um número inteiro. Consulte o Registro do protocolo de autenticação extensível (EAP). Por exemplo, a configuração a seguir é para SOME_SSID_NAME usando EAP-AKA e Some_Other_SSID usando EAP-SIM: - config { key: "carrier_wifi_string_array" text_array { item: "U09NRV9TU0lEX05BTUUK,23" item: "U29tZV9PdGhlcl9TU0lECg==,18" } }
No gerenciador de configurações da operadora, configure os seguintes parâmetros para cada operadora:
- imsi_key_availability_int:- Identifica se a chave usada para criptografia de IMSI está disponível para WLAN (bit 1 definido), EPDG (bit 0 definido) ou ambos (bits 0 e 1 definidos). Por exemplo, a configuração a seguir indica que a criptografia IMSI 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 de onde o proto que contém a chave pública da operadora usada para criptografia de IMSI é baixado. Por exemplo, a configuração a seguir 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 flag que indica se é permitido fazer o download da chave pública da operadora em uma rede limitada (celular). Se essa flag não estiver definida, um novo dispositivo sem conectividade Wi-Fi não poderá se conectar à rede Wi-Fi da operadora porque não terá permissão para baixar a chave.- config { key: "allow_metered_network_for_cert_download_bool" bool_value: true }
Operadoras
Para implementar o Wi-Fi da operadora, ela precisa ativar a proteção de privacidade do IMSI e fornecer uma chave pública.
Proteção de privacidade do IMSI
O Android protege a confidencialidade da identidade permanente de um assinante (IMSI) usando criptografia de chave pública. O Android implementa a especificação da Wireless Broadband Alliance (WBA) para proteção de privacidade do IMSI para Wi-Fi. Quando a proteção de privacidade do IMSI está ativada para uma conexão, a identidade permanente do assinante não é transmitida sem criptografia pelo 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 único octeto que define o método EAP usado para a autenticação:
- 0: EAP-AKA
- 1: EAP-SIM
- 6: EAP-AKA'
 
- O formato do domínio NAI é
wlan.mnc<var>XXX</var>.mcc<var>YYY</var>.3gppnetwork.org, em queXXXé substituído pelo código de rede móvel (MNC) do chip eYYYé substituído pelo código de país para dispositivos móveis (MCC).
- A identidade permanente é criptografada usando uma chave pública RSA fornecida pela operadora. A chave pública está incluída em um certificado X.509.
- O esquema de criptografia é RSAES-OAEP com SHA-256 como a função hash criptográfica. Esse esquema garante um texto cifrado exclusivo sempre que é usado, evitando outra identidade persistente que pode ser rastreada.
- O comprimento da chave RSA é de 2.048 bits.
- O buffer de criptografia é de 256 bytes.
- O texto cifrado é codificado com Base64.
- 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 da chave
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 a
autenticação. Um exemplo de identificador de chave é
CertificateSerialNumber=123456. Se o identificador de chave for fornecido, ele será enviado
em texto simples como parte do processo de autenticação.
Modificações nos métodos de autenticação EAP baseados em SIM
Quando a proteção de privacidade do IMSI está ativada em uma conexão, o sistema não envia
a identidade permanente ao receber EAP-Request/Identity. Em vez disso, ele
responde com um login anônimo:
SERVER: EAP-Request/Identity
UE: EAP-Response/Identity AT_IDENTITY=<prefix>|anonymous@<NAI Realm>
<prefix> é opcional. Se a configuração da operadora enable_eap_method_prefix_bool estiver definida como true, o primeiro caractere da identidade (antes de anonymous) vai notificar o servidor sobre o tipo de método EAP usado antes do início da troca de EAP.
- 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 na mensagem.
Em resposta, o servidor envia uma mensagem EAP-Request/AKA-Identity e o
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 de que uma identidade criptografada está sendo usada ou o tipo de método EAP configurado:
- \0: identidade permanente criptografada
- 0: EAP-AKA
- 1: EAP-SIM
- 6: EAP-AKA'
O par de valores de atributo do identificador de chave é opcional e não é anexado ao final da identidade permanente criptografada se não estiver em uso.
Nesse ponto, o servidor localiza a chave privada do identificador de chave (se fornecido), descriptografa a identidade criptografada usando a chave privada da operadora e continua o fluxo normal do EAP.
Após a autenticação, o servidor pode fornecer uma identidade de reautenticação rápida ou uma identidade temporária (pseudônimo), que é usada em conexões subsequentes. Se o servidor não fornecer identidades temporárias, o sistema enviará a identidade criptografada na conexão subsequente.
Recuperação, expiração e revogação de certificados da operadora
Se nenhum certificado estiver instalado no sistema, ele usará o URL fornecido
na configuração da operadora imsi_key_download_url_string para baixar um
certificado usando o método HTTP GET. O sistema usa dados da rede celular somente se a configuração da operadora allow_metered_network_for_cert_download_bool estiver definida como true. Caso contrário, o sistema baixa o certificado somente quando uma conexão Wi-Fi
estiver disponível.
O sistema impõe o vencimento do certificado. O sistema começa a tentar renovar os certificados 21 dias antes da data de validade e usa o mesmo URL para baixar o novo certificado.
Se o servidor não conseguir descriptografar a identidade criptografada, ele vai enviar uma mensagem
EAP-Request/AKA-Notification com o código AT_NOTIFICATION
General Failure (16384) para encerrar a troca de EAP.
Se o certificado for revogado ou expirar, 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ísticas internas para determinar se é necessário remover o certificado e tentar baixar um novo certificado do mesmo URL.
Fornecer a chave pública
Forneça um URL público para um servidor, de preferência usando HTTP em vez de TLS, que hospede o certificado da operadora em que:
- A chave pública e o vencimento podem ser extraídos do certificado.
- As informações do servidor estão no formato JSON, como a seguir: - 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.- Confira 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-----" } ] }
