WLAN des Mobilfunkanbieters

Das WLAN des Mobilfunkanbieters ist eine automatische Verbindungsfunktion (mit verschlüsselter IMSI), die unter Android 9 und höher verfügbar ist. Damit können sich Geräte automatisch mit WLANs des Mobilfunkanbieters verbinden. In stark überlasteten Gebieten oder mit minimaler Mobilfunkabdeckung, z. B. in Stadien oder U-Bahnstationen, kann das WLAN eines Mobilfunkanbieters verwendet werden, um die Konnektivität der Nutzer zu verbessern und den Traffic zu entlasten.

Geräte mit der WLAN-Funktion des Mobilfunkanbieters stellen automatisch eine Verbindung zu konfigurierten WLANs des Mobilfunkanbieters her (Netzwerke mit einem Public-Key-Zertifikat). Wenn ein Nutzer die Verbindung zu einem WLAN eines Mobilfunkanbieters manuell trennt, wird das Netzwerk für 24 Stunden auf die schwarze Liste gesetzt (keine automatische Verbindung). Nutzer können jederzeit manuell eine Verbindung zu Netzwerken herstellen, die auf die Sperrliste gesetzt wurden.

Implementierung

Gerätehersteller und Mobilfunkanbieter müssen Folgendes tun, um WLAN-Hotspots von Mobilfunkanbietern zu implementieren.

Hersteller

Verwenden Sie auf Geräten mit Android 11 und höher die Wi-Fi Suggestion API, um WLAN-Profile für jeden Mobilfunkanbieter hinzuzufügen.

Fügen Sie auf Geräten mit Android 10 oder niedriger 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, bei dem jeder Stringeintrag eine Base64-codierte WLAN-SSID und ein EAP-Typ ist, die durch ein Komma getrennt sind. Der EAP-Typ ist eine Ganzzahl (siehe EAP-Registry (Extensible Authentication Protocol)). Die folgende Konfiguration gilt beispielsweise für EINE_SSID_NAME mit EAP-AKA und EINE_ANDERE_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 gesetzt), EPDG (Bit 0 ist gesetzt) oder beides (sowohl Bit 0 als auch Bit 1 sind gesetzt) verfügbar ist. Die folgende Konfiguration gibt beispielsweise an, dass die IMSI-Verschlüsselung für WLAN verfügbar ist, aber nicht für EPDG:

    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. In der folgenden Konfiguration wird beispielsweise eine bestimmte URL angegeben:

    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 der Download des öffentlichen Schlüssels des Mobilfunkanbieters über ein kostenpflichtiges Mobilfunknetz zulässig ist. Wenn dieses Flag nicht gesetzt ist, kann ein neues Gerät ohne WLAN-Verbindung keine Verbindung zum WLAN des Mobilfunkanbieters herstellen, da es den Schlüssel nicht herunterladen darf.

    config {
      key: "allow_metered_network_for_cert_download_bool"
      bool_value: true
    }
    

Mobilfunkanbieter

Um WLANs von Mobilfunkanbietern zu implementieren, muss der Mobilfunkanbieter den IMSI-Datenschutz aktivieren und einen öffentlichen Schlüssel angeben.

IMSI-Datenschutz

Android schützt die Vertraulichkeit der permanenten Identität (IMSI) eines Abonnenten mithilfe der Public-Key-Kryptografie. Android implementiert die Spezifikation der Wireless Broadband Alliance (WBA) für den IMSI-Datenschutz für WLAN. Wenn der IMSI-Datenschutz für eine Verbindung aktiviert ist, wird die permanente Teilnehmeridentität nicht unverschlüsselt per Funk ü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 EAP-Methode definiert, die für die Authentifizierung verwendet wird:
    • 0: EAP-AKA
    • 1: EAP-SIM
    • 6: EAP-AKA'
  • Das NAI-Realm-Format ist wlan.mncXXX.mccYYY.3gppnetwork.org, wobei XXX durch den Mobilfunknetzcode (MNC) der SIM-Karte und YYY durch den Mobilfunkländercode (MCC) ersetzt wird.
  • Die dauerhafte Identität wird mit einem vom Mobilfunkanbieter bereitgestellten RSA-öffentlichen Schlüssel verschlüsselt. 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 bei jeder Verwendung des Schemas einen eindeutigen Geheimtext und verhindert 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 Geheimtext wird mit Base64 codiert.
  • Die Länge der verschlüsselten dauerhaften Identität 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 ist, 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 nach Erhalt von EAP-Request/Identity nicht die permanente Identität, sondern antwortet 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-Mobilfunkanbieterkonfiguration auf true gesetzt ist, wird der Server über den ersten Charakter der Identität (vor anonymous) über die Art der verwendeten EAP-Methode informiert, bevor der EAP-Austausch beginnt.

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

Wenn die Mobilfunkanbieterkonfiguration auf false festgelegt ist, ist dieses Präfix nicht in der Nachricht enthalten.

Als Antwort 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 entweder darüber, dass eine verschlüsselte Identität verwendet wird, oder über die konfigurierte EAP-Methode:

  • \0: Verschlüsselte permanente Identität
  • 0: EAP-AKA
  • 1: EAP-SIM
  • 6: EAP-AKA'

Das Attribut-Wert-Paar „key identifier“ ist optional und wird der verschlüsselten permanenten Identität nicht angefügt, 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 fährt mit dem 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 für nachfolgende 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 Mobilfunkanbieterzertifikaten

Wenn im System kein Zertifikat installiert ist, verwendet das System die in der imsi_key_download_url_string-Mobilfunkanbieterkonfiguration angegebene URL, um ein Zertifikat mit der HTTP-GET-Methode herunterzuladen. Das System verwendet nur mobile Daten, wenn die allow_metered_network_for_cert_download_bool-Mobilfunkanbieterkonfiguration auf true festgelegt ist. Andernfalls lädt das System das Zertifikat nur herunter, wenn eine WLAN-Verbindung verfügbar ist.

Der Ablauf des Zertifikats wird vom System erzwungen. Das System versucht, 21 Tage vor dem Ablaufdatum des Zertifikats eine Verlängerung durchzuführen. Dabei 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 AT_NOTIFICATION-Code General Failure (16384), um den EAP-Austausch zu beenden.

Wenn das Zertifikat widerrufen oder abgelaufen ist, sendet der Server eine EAP-Request/AKA-Notification-Nachricht mit dem AT_NOTIFICATION-Code Certificate Replacement Required (16385), um den EAP-Austausch zu beenden. Daraufhin wendet das System interne Heuristiken an, um zu bestimmen, ob das Zertifikat entfernt und versucht werden soll, ein neues Zertifikat von derselben URL herunterzuladen.

Geben Sie den öffentlichen Schlüssel an.

Geben Sie eine öffentliche URL für einen Server an, vorzugsweise mit HTTP über TLS, auf dem das Zertifikat des Mobilfunkanbieters gehostet wird. Dabei gelten folgende Anforderungen:

  1. Der öffentliche Schlüssel und das Ablaufdatum können aus dem Zertifikat extrahiert werden.
  2. Die Informationen vom Server sind im JSON-Format:

    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.
    

    Im Folgenden finden Sie 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-----"
    } ]
    }