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