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-AKA1: EAP-SIM6: 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-AKA1: EAP-SIM6: 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-AKA1: EAP-SIM6: 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, на котором размещен сертификат оператора связи, где:
- Открытый ключ и срок действия можно извлечь из сертификата.
Информация с сервера передается в формате 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-----" } ] }