Оператор Wi-Fi

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

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

На устройствах под управлением Android 9 или более поздней версии с реализованным оператором Wi-Fi автоматическое подключение через оператор Wi-Fi по умолчанию отключено. Уведомление отправляется пользователю, когда устройство впервые пытается подключиться к сети Wi-Fi оператора связи.

Выполнение

Производители устройств и операторы связи должны выполнить следующие действия для внедрения операторского Wi-Fi.

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

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

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

  • carrier_wifi_string_array : массив строк, где каждая строковая запись представляет собой SSID Wi-Fi в кодировке Base64 и тип 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: wlan.mnc XXX .mcc YYY .3gppnetwork.org , где XXX заменяется кодом мобильной сети SIM-карты (MNC), а 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_NOTIFICATION General 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-----"
    } ]
    }