Wi-Fi оператора связи

Carrier Wi-Fi – это функция автоматического подключения (с использованием зашифрованного IMSI), доступная в Android 9 и более поздних версий. Она позволяет устройствам автоматически подключаться к сетям Wi-Fi, реализованным операторами связи. В местах с высокой нагрузкой на сеть или плохим покрытием, например на стадионах или подземных станциях, Wi-Fi оператора может улучшить качество связи и снизить нагрузку на сеть.

Устройства с функцией Wi-Fi оператора автоматически подключаются к настроенным сетям Wi-Fi оператора (сетям с сертификатом открытого ключа). Если пользователь вручную отключится от сети Wi-Fi оператора, она будет добавлена в черный список на 24 часа (автоматическое подключение будет запрещено). Пользователи могут в любое время вручную подключиться к сетям, добавленным в черный список.

Реализация

Чтобы реализовать Wi-Fi оператора, производители устройств и операторы связи должны выполнить следующие действия:

Производители

Для устройств с Android 11 и более поздних версий используйте Wi-Fi suggestion API, чтобы добавить профили Wi-Fi для каждого оператора.

На устройствах с Android 10 или более ранней версии добавьте профили Wi-Fi, настроив параметр carrier_wifi_string_array для каждого оператора в менеджере конфигурации оператора.

  • carrier_wifi_string_array:

    Массив строк, в котором каждая строка представляет собой закодированный в Base64 идентификатор SSID сети Wi-Fi и тип EAP, разделенные запятой. Тип EAP – это целое число (см. реестр расширяемого протокола аутентификации (EAP)). Например, следующая конфигурация предназначена для сети SOME_SSID_NAME с использованием EAP-AKA и Some_Other_SSID с использованием EAP-SIM:

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

В менеджере конфигураций оператора задайте следующие параметры для каждого оператора:

  • imsi_key_availability_int:

    Указывает, доступен ли ключ, используемый для шифрования IMSI, для WLAN (установлен бит 1), EPDG (установлен бит 0) или обоих (установлены биты 0 и 1). Например, следующая конфигурация указывает, что шифрование IMSI доступно для WLAN, но не для EPDG:

    config {
      key: "imsi_key_availability_int"
      int_value: 2
    }
    
  • imsi_key_download_url_string:

    URL, с которого скачивается протокол, содержащий открытый ключ оператора, используемый для шифрования IMSI. Например, следующая конфигурация позволяет указать определенный URL:

    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: флаг, указывающий, разрешено ли скачивать открытый ключ оператора через мобильную сеть. Если этот флаг не задан, новое устройство без подключения к Wi-Fi не сможет подключиться к сети Wi-Fi оператора, поскольку ему не будет разрешено скачать ключ.

    config {
      key: "allow_metered_network_for_cert_download_bool"
      bool_value: true
    }
    

Операторы связи

Чтобы реализовать звонки по Wi-Fi, оператор должен включить защиту конфиденциальности IMSI и предоставить открытый ключ.

Защита конфиденциальности IMSI

Android защищает конфиденциальность постоянного идентификатора абонента (IMSI) с помощью криптографии с открытым ключом. В Android реализована спецификация Wireless Broadband Alliance (WBA) для защиты конфиденциальности IMSI в Wi-Fi. Если для подключения включена защита конфиденциальности IMSI, постоянный идентификатор абонента не передается по беспроводному каналу в открытом виде.

Постоянное шифрование идентификационной информации

Зашифрованный постоянный идентификатор имеет следующий формат:

  • Постоянный идентификатор имеет формат <EAP-Method><IMSI>@<NAI realm>.
  • Префикс EAP-Method – это один октет, который определяет метод EAP, используемый для аутентификации:
    • 0: EAP-AKA
    • 1: EAP-SIM
    • 6: EAP-AKA'
  • Формат NAI realm: wlan.mnc<var>XXX</var>.mcc<var>YYY</var>.3gppnetwork.org, где XXX – код мобильной сети (MNC) SIM-карты, а YYY – код страны (MCC).
  • Постоянный идентификатор шифруется с помощью открытого ключа RSA, предоставленного оператором связи. Открытый ключ включен в сертификат X.509.
  • Схема шифрования – RSAES-OAEP с SHA-256 в качестве криптографической хеш-функции. Эта схема шифрования гарантирует уникальность зашифрованного текста при каждом использовании, что позволяет избежать создания ещё одного постоянного идентификатора, который можно отслеживать.
  • Длина ключа RSA составляет 2048 бит.
  • Буфер шифрования имеет размер 256 байтов.
  • Зашифрованный текст кодируется с использованием Base64.
  • Длина зашифрованного постоянного идентификатора составляет 344 байта.
Encrypted Permanent Identity = Base64(RSAES-OAEP-SHA-256(<EAP-Method><IMSI>@<NAI Realm>))
Идентификатор ключа

Идентификатор ключа – это необязательная пара "атрибут-значение", которую оператор связи добавляет в сертификат, чтобы сервер мог найти нужный закрытый ключ во время аутентификации. Пример ключевого идентификатора:CertificateSerialNumber=123456. Если идентификатор ключа указан, он отправляется в открытом виде в рамках процесса аутентификации.

Изменения в способах аутентификации EAP на основе SIM-карты

Если защита конфиденциальности IMSI включена для подключения, система не отправляет постоянный идентификатор при получении EAP-Request/Identity, а отвечает анонимным входом:

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

<prefix> – необязательный параметр. Если для конфигурации оператора enable_eap_method_prefix_bool задано значение true, первый символ идентификатора (до anonymous) уведомляет сервер о типе метода EAP, используемого до начала обмена EAP.

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

Если в конфигурации оператора задано значение false, этот префикс не будет включен в сообщение.

В ответ сервер отправляет сообщение EAP-Request/AKA-Identity, а система отвечает в следующем формате:

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

Первый символ идентификатора сообщает серверу, используется ли зашифрованный идентификатор, или тип настроенного метода EAP:

  • \0: зашифрованный постоянный идентификатор
  • 0: EAP-AKA
  • 1: EAP-SIM
  • 6: EAP-AKA'

Пара "ключ-значение" для атрибута идентификатора ключа является необязательной и не добавляется в конец зашифрованного постоянного идентификатора, если не используется.

На этом этапе сервер находит закрытый ключ по идентификатору ключа (если он указан), расшифровывает зашифрованную идентификационную информацию с помощью закрытого ключа оператора и продолжает обычный процесс EAP.

После успешной аутентификации сервер может предоставить идентификатор для быстрой повторной аутентификации или временный идентификатор (псевдоним), который используется в последующих подключениях. Если сервер не предоставит временные идентификаторы, система отправит зашифрованный идентификатор при следующем подключении.

Получение, аннулирование и истечение срока действия сертификата оператора

Если в системе не установлен сертификат, она использует URL, указанный в конфигурации оператора imsi_key_download_url_string, чтобы скачать сертификат с помощью метода HTTP GET. Система использует мобильный интернет, только если в конфигурации оператора allow_metered_network_for_cert_download_bool задано значение true. В противном случае система скачает сертификат, только когда будет доступно подключение по Wi-Fi.

Срок действия сертификата устанавливается системой. Система начинает попытки продлить сертификаты за 21 день до даты окончания срока действия сертификата и использует тот же URL для скачивания нового сертификата.

Если сервер не может расшифровать зашифрованные учетные данные, он отправляет сообщение EAP-Request/AKA-Notification с кодом AT_NOTIFICATIONGeneral Failure (16384), чтобы завершить обмен EAP.

Если сертификат отозван или срок его действия истек, сервер отправляет сообщение EAP-Request/AKA-Notification с кодом AT_NOTIFICATION Certificate Replacement Required (16385), чтобы завершить обмен данными по протоколу EAP. В ответ система применяет внутренние эвристические алгоритмы, чтобы определить, нужно ли удалить сертификат и попытаться скачать новый сертификат с того же URL.

Как предоставить открытый ключ

Укажите общедоступный URL сервера, желательно с использованием протокола HTTP через TLS, на котором размещен сертификат оператора связи, где:

  1. Открытый ключ и срок действия можно извлечь из сертификата.
  2. Информация с сервера передается в формате JSON:

    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.
    

    Ниже приведен пример открытого ключа.

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