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. So können sich Geräte automatisch mit WLANs des Mobilfunkanbieters verbinden. In Bereichen mit hoher Auslastung oder minimaler Mobilfunkabdeckung, z. B. in Stadion oder U-Bahn-Stationen, kann das Mobilfunkbetreiber-WLAN 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 zum WLAN des Mobilfunkanbieters manuell trennt, wird das Netzwerk 24 Stunden lang 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, in dem jeder Stringeintrag eine Base64-codierte WLAN-SSID und ein EAP-Typ ist, der durch ein Komma getrennt ist, wobei der EAP-Typ eine Ganzzahl ist (siehe Extensible Authentication Protocol (EAP) Registry). 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 festgelegt), EPDG (Bit 0 festgelegt) oder beides verfügbar ist (Bit 0 und Bit 1 sind festgelegt). Die folgende Konfiguration zeigt 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 die Proto-Datei mit dem öffentlichen Schlüssel des für die IMSI-Verschlüsselung verwendeten Trägers heruntergeladen 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 festgelegt 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 persistente 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 ist 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üsselkennung 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
  • 1: EAP-SIM
  • 6: EAP – auch bekannt als

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 den Typ der konfigurierten EAP-Methode:

  • \0: Verschlüsselte permanente Identität
  • 0: EAP – kurz: EAP
  • 1: EAP-SIM
  • 6: EAP – auch bekannt als

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 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 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 vorzunehmen. 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. Das System wendet daraufhin interne Heuristiken an, um festzustellen, ob das Zertifikat entfernt werden soll und ob versucht wird, ein neues Zertifikat von derselben URL herunterzuladen.

Geben Sie den öffentlichen Schlüssel an.

Geben Sie eine öffentliche URL zu einem Server an, der das Zertifikat des Mobilfunkanbieters hostet, vorzugsweise HTTP über TLS. Dabei gilt Folgendes:

  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-----"
    } ]
    }