Carrier Wi‑Fi ist eine Funktion für die automatische Verbindung (mit verschlüsselter IMSI), die in Android 9 und höher verfügbar ist. Damit können Geräte automatisch eine Verbindung zu von Mobilfunkanbietern implementierten WLANs herstellen. In Gebieten mit hoher Überlastung oder minimaler Mobilfunkabdeckung, z. B. in einem Stadion oder einer U-Bahn-Station, kann das WLAN des Mobilfunkanbieters verwendet werden, um die Konnektivität der Nutzer zu verbessern und den Traffic zu entlasten.
Geräte mit der Funktion „WLAN des Mobilfunkanbieters“ verbinden sich automatisch mit konfigurierten WLANs des Mobilfunkanbieters (Netzwerke mit einem Zertifikat für den öffentlichen Schlüssel). Wenn ein Nutzer die Verbindung zu einem WLAN eines Mobilfunkanbieters manuell trennt, wird das Netzwerk für 24 Stunden auf die Sperrliste gesetzt (keine automatische Verbindung). Nutzer können jederzeit manuell eine Verbindung zu auf der Sperrliste stehenden Netzwerken herstellen.
Implementierung
Gerätehersteller und Mobilfunkanbieter müssen Folgendes tun, um Carrier-WLAN zu implementieren.
Hersteller
Verwenden Sie für Geräte mit Android 11 und höher die Wi-Fi Suggestion API, um WLAN-Profile für jeden Mobilfunkanbieter hinzuzufügen.
Bei Geräten mit Android 10 oder niedriger fügen Sie WLAN-Profile hinzu, indem Sie den Parameter carrier_wifi_string_array
für jeden Mobilfunkanbieter im Carrier Config Manager konfigurieren.
carrier_wifi_string_array
: Ein String-Array, in dem jeder String-Eintrag eine Base64-codierte WLAN-SSID und ein durch ein Komma getrennter EAP-Typ ist. Der EAP-Typ ist eine Ganzzahl (siehe Extensible Authentication Protocol (EAP) Registry). Die folgende Konfiguration gilt beispielsweise für SOME_SSID_NAME mit EAP-AKA und Some_Other_SSID mit EAP-SIM:config { key: "carrier_wifi_string_array" text_array { item: "U09NRV9TU0lEX05BTUUK,23" item: "U29tZV9PdGhlcl9TU0lECg==,18" } }
Konfigurieren Sie im Carrier Config Manager die folgenden Parameter für jeden Mobilfunkanbieter:
imsi_key_availability_int
: Gibt an, ob der für die IMSI-Verschlüsselung verwendete Schlüssel für WLAN (Bit 1 ist festgelegt), EPDG (Bit 0 ist festgelegt) oder beides (Bit 0 und Bit 1 sind festgelegt) verfügbar ist. Die folgende Konfiguration gibt beispielsweise an, dass die IMSI-Verschlüsselung für WLAN, aber nicht für EPDG verfügbar ist:config { key: "imsi_key_availability_int" int_value: 2 }
imsi_key_download_url_string
: URL, von der das Proto mit dem öffentlichen Schlüssel des Mobilfunkanbieters heruntergeladen wird, der für die IMSI-Verschlüsselung verwendet wird. Die folgende Konfiguration gibt beispielsweise eine bestimmte URL an: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
: Ein Flag, das angibt, ob das Herunterladen des öffentlichen Schlüssels des Mobilfunkanbieters über ein Netzwerk mit nutzungsabhängiger Abrechnung (Mobilfunknetz) zulässig ist. Wenn dieses Flag nicht festgelegt ist, kann ein neues Gerät ohne WLAN-Verbindung keine Verbindung zum WLAN des Mobilfunkanbieters herstellen, da der Schlüssel nicht heruntergeladen werden darf.config { key: "allow_metered_network_for_cert_download_bool" bool_value: true }
Mobilfunkanbieter
Um Carrier-WLAN zu implementieren, muss der Mobilfunkanbieter den IMSI-Datenschutz aktivieren und einen öffentlichen Schlüssel bereitstellen.
IMSI-Datenschutz
Android schützt die Vertraulichkeit der permanenten Identität (IMSI) eines Abonnenten mithilfe von Public-Key-Kryptografie. In Android wird die Spezifikation der Wireless Broadband Alliance (WBA) für IMSI Privacy Protection for Wi-Fi (IMSI-Datenschutz für WLAN) implementiert. Wenn der IMSI-Datenschutz für eine Verbindung aktiviert ist, wird die permanente Teilnehmeridentität nicht unverschlüsselt über die Luftschnittstelle übertragen.
Permanente Identitätsverschlüsselung
Die verschlüsselte permanente Identität hat folgendes Format:
- Die dauerhafte Identität hat das Format
<EAP-Method><IMSI>@<NAI realm>
. - Das EAP-Methodenpräfix ist ein einzelnes Oktett, das die für die Authentifizierung verwendete EAP-Methode definiert:
0
: EAP-AKA1
: EAP-SIM6
: EAP-AKA'
- Das NAI-Realm-Format ist
wlan.mncXXX.mccYYY.3gppnetwork.org
, wobeiXXX
durch den MNC (Mobile Network Code) der SIM-Karte undYYY
durch den MCC (Mobile Country Code) ersetzt wird. - Die dauerhafte Identität wird mit einem öffentlichen RSA-Schlüssel verschlüsselt, der vom Mobilfunkanbieter bereitgestellt wird. Der öffentliche Schlüssel ist in einem X.509-Zertifikat enthalten.
- Das Verschlüsselungsschema ist RSAES-OAEP mit SHA-256 als kryptografischer Hash-Funktion. Dieses Verschlüsselungsschema garantiert einen eindeutigen Chiffretext bei jeder Verwendung des Schemas und vermeidet so eine weitere dauerhafte Identität, die nachverfolgt werden kann.
- Die RSA-Schlüssellänge beträgt 2.048 Bit.
- Der Verschlüsselungspuffer hat eine Größe von 256 Byte.
- Der Chiffretext ist mit Base64 codiert.
- Die Länge der verschlüsselten permanenten Identität in der Ausgabe beträgt 344 Byte.
Encrypted Permanent Identity = Base64(RSAES-OAEP-SHA-256(<EAP-Method><IMSI>@<NAI Realm>))
Schlüsselkennung
Die Schlüssel-ID ist ein optionales Attribut-Wert-Paar, das der Mobilfunkanbieter an ein Zertifikat anhängt, damit der Server während der Authentifizierung den richtigen privaten Schlüssel finden kann. Ein Beispiel für eine Schlüssel-ID ist CertificateSerialNumber=123456
. Wenn die Schlüssel-ID angegeben wird, wird sie im Rahmen des Authentifizierungsprozesses unverschlüsselt gesendet.
Änderungen an SIM-basierten EAP-Authentifizierungsmethoden
Wenn der IMSI-Datenschutz für eine Verbindung aktiviert ist, sendet das System die permanente Identität nicht, wenn es EAP-Request/Identity
empfängt. Stattdessen antwortet es mit einer anonymen Anmeldung:
SERVER: EAP-Request/Identity
UE: EAP-Response/Identity AT_IDENTITY=<prefix>|anonymous@<NAI Realm>
<prefix>
ist optional. Wenn die enable_eap_method_prefix_bool
-Carrier-Konfiguration auf true
gesetzt ist, wird der Server durch das erste Zeichen der Identität (vor anonymous
) über den Typ der EAP-Methode informiert, die vor Beginn des EAP-Austauschs verwendet wird.
0
: EAP-AKA1
: EAP-SIM6
: EAP-AKA'
Wenn die Konfiguration des Mobilfunkanbieters auf false
festgelegt ist, ist dieses Präfix nicht in der Nachricht enthalten.
Als Reaktion darauf sendet der Server eine EAP-Request/AKA-Identity
-Nachricht und das System antwortet im folgenden Format:
SERVER: EAP-Request/AKA-Identity AT_ANY_ID_REQ
UE: EAP-Response/AKA-Identity AT_IDENTITY=<prefix>|<Encrypted Permanent Identity>|","|"<attribute>=<value>"
Das erste Zeichen der Identität informiert den Server darüber, ob eine verschlüsselte Identität verwendet wird oder welcher EAP-Typ konfiguriert ist:
\0
: Verschlüsselte permanente Identität0
: EAP-AKA1
: EAP-SIM6
: EAP-AKA'
Das Schlüssel-ID-Attribut-Wert-Paar ist optional und wird nicht an das Ende der verschlüsselten permanenten Identität angehängt, wenn es nicht verwendet wird.
An diesem Punkt sucht der Server den privaten Schlüssel anhand der Schlüssel-ID (falls angegeben), entschlüsselt die verschlüsselte Identität mit dem privaten Schlüssel des Mobilfunkanbieters und setzt den normalen EAP-Ablauf fort.
Nach erfolgreicher Authentifizierung kann der Server eine Identität für die schnelle erneute Authentifizierung oder eine temporäre Identität (Pseudonym) bereitstellen, die bei nachfolgenden Verbindungen verwendet wird. Wenn der Server keine temporären Identitäten bereitstellt, sendet das System die verschlüsselte Identität in der nachfolgenden Verbindung.
Abrufen, Ablauf und Widerruf von Betreiberzertifikaten
Wenn kein Zertifikat im System installiert ist, verwendet das System die in der imsi_key_download_url_string
-Carrier-Konfiguration angegebene URL, um ein Zertifikat mit der HTTP GET-Methode herunterzuladen. Das System verwendet mobile Daten nur, wenn die allow_metered_network_for_cert_download_bool
-Konfiguration des Mobilfunkanbieters auf true
festgelegt ist. Andernfalls lädt das System das Zertifikat nur herunter, wenn eine WLAN-Verbindung besteht.
Der Ablauf des Zertifikats wird vom System erzwungen. Das System versucht 21 Tage vor dem Ablaufdatum des Zertifikats, es zu verlängern. Dazu wird dieselbe URL verwendet, um das neue Zertifikat herunterzuladen.
Wenn der Server die verschlüsselte Identität nicht entschlüsseln kann, sendet er eine EAP-Request/AKA-Notification
-Nachricht mit dem Code AT_NOTIFICATION
General Failure
(16384), um den EAP-Austausch zu beenden.
Wenn das Zertifikat widerrufen wurde oder abgelaufen ist, sendet der Server eine EAP-Request/AKA-Notification
-Nachricht mit dem Code AT_NOTIFICATION
Certificate Replacement Required
(16385), um den EAP-Austausch zu beenden.
Das System wendet daraufhin interne Heuristiken an, um zu entscheiden, ob das Zertifikat entfernt und versucht werden soll, ein neues Zertifikat von derselben URL herunterzuladen.
Öffentlichen Schlüssel angeben
Geben Sie eine öffentliche URL zu einem Server an, vorzugsweise über HTTP über TLS, auf dem das Zertifikat des Mobilfunkanbieters gehostet wird. Dabei gilt:
- Der öffentliche Schlüssel und das Ablaufdatum können aus dem Zertifikat extrahiert werden.
Die Informationen vom Server sind im JSON-Format wie folgt:
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.
Hier ein Beispiel für einen öffentlichen Schlüssel.
{ "carrier-keys" : [ { "key-identifier" : "CertificateSerialNumber=5xxe06d4", "public-key" : "-----BEGIN CERTIFICATE-----\r\nTIIDRTCCAi2gAwIBAgIEVR4G1DANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJVUzELMAkGA1UE\r\nCBMCTkExCzAJBgNVBAcTAk5BMQswCQYDVQQKEwJOQTELMAkGA1UECxMCTkExEDAOBgNVBAMTB1Rl\r\nc3RiT6N1/w==\r\n-----END CERTIFICATE-----" } ] }