Wi-Fi de l'opérateur

Le Wi-Fi de l'opérateur est une fonctionnalité de connexion automatique (utilisant l'IMSI chiffré) disponible dans Android 9 et versions ultérieures. Elle permet aux appareils de se connecter automatiquement aux réseaux Wi-Fi implémentés par l'opérateur. Dans les zones très encombrées ou avec une couverture mobile minimale, comme un stade ou une station de métro, le Wi-Fi de l'opérateur peut être utilisé pour améliorer l'expérience de connectivité des utilisateurs et décharger le trafic.

Les appareils dotés de la fonctionnalité Wi-Fi de l'opérateur se connectent automatiquement aux réseaux Wi-Fi de l'opérateur configurés (réseaux avec un certificat de clé publique). Lorsqu'un utilisateur se déconnecte manuellement d'un réseau Wi-Fi d'opérateur, le réseau est mis sur liste noire pendant 24 heures (aucune connexion automatique). Les utilisateurs peuvent se connecter manuellement à des réseaux mis sur liste noire à tout moment.

Implémentation

Les fabricants d'appareils et les opérateurs doivent procéder comme suit pour implémenter le Wi-Fi de l'opérateur.

Fabricants

Pour les appareils équipés d'Android 11 ou version ultérieure, utilisez l'API de suggestion Wi-Fi pour ajouter des profils Wi-Fi pour chaque opérateur.

Pour les appareils équipés d'Android 10 ou version antérieure, ajoutez des profils Wi-Fi en configurant le paramètre carrier_wifi_string_array pour chaque opérateur dans le gestionnaire de configuration de l'opérateur.

  • carrier_wifi_string_array : tableau de chaînes où chaque entrée de chaîne est un SSID Wi-Fi encodé en Base64 et un type EAP séparés par une virgule, où le type EAP est un entier (voir le registre EAP (Extensible Authentication Protocol)). Par exemple, la configuration suivante concerne SOME_SSID_NAME avec EAP-AKA et Some_Other_SSID avec EAP-SIM :

    config {
      key: "carrier_wifi_string_array"
      text_array {
        item: "U09NRV9TU0lEX05BTUUK,23"
        item: "U29tZV9PdGhlcl9TU0lECg==,18"
      }
    }
    

Dans le gestionnaire de configuration de l'opérateur, configurez les paramètres suivants pour chaque opérateur :

  • imsi_key_availability_int : Indique si la clé utilisée pour le chiffrement IMSI est disponible pour le WLAN (bit 1 est défini), l'EPDG (bit 0 est défini) ou les deux (bit 0 et bit 1 sont définis). Par exemple, la configuration suivante indique que le chiffrement IMSI est disponible pour le WLAN, mais pas pour l'EPDG :

    config {
      key: "imsi_key_availability_int"
      int_value: 2
    }
    
  • imsi_key_download_url_string : URL à partir de laquelle le fichier proto contenant la clé publique de l'opérateur utilisé pour le chiffrement IMSI est téléchargé. Par exemple, la configuration suivante fournit une URL spécifique :

    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 : indicateur permettant de déterminer s'il faut autoriser le téléchargement de la clé publique de l'opérateur sur un réseau facturé à l'usage (mobile). Si cet indicateur n'est pas défini, un nouvel appareil sans connectivité Wi-Fi ne pourra pas se connecter au réseau Wi-Fi de l'opérateur, car il ne sera pas autorisé à télécharger la clé.

    config {
      key: "allow_metered_network_for_cert_download_bool"
      bool_value: true
    }
    

Opérateurs

Pour implémenter le Wi-Fi de l'opérateur, celui-ci doit activer la protection de la confidentialité de l'IMSI et fournir une clé publique.

Protection de la confidentialité de l'IMSI

Android protège la confidentialité de l'identité permanente d'un abonné (IMSI) à l'aide de la cryptographie à clé publique. Android implémente la spécification de la Wireless Broadband Alliance (WBA) pour la protection de la confidentialité de l'IMSI pour le Wi-Fi. Lorsque la protection de la confidentialité IMSI est activée pour une connexion, l'identité permanente de l'abonné n'est pas transmise en clair par voie hertzienne.

Chiffrement de l'identité permanente

Le format de l'identité permanente chiffrée est le suivant :

  • L'identité permanente est au format <EAP-Method><IMSI>@<NAI realm>.
  • Le préfixe EAP-Method est un octet unique qui définit la méthode EAP utilisée pour l'authentification :
    • 0 : EAP-AKA
    • 1 : EAP-SIM
    • 6 : EAP-AKA'
  • Le format du domaine NAI est wlan.mncXXX.mccYYY.3gppnetwork.org, où XXX est remplacé par le mobile network code (MNC) de la carte SIM et YYY par le mobile country code (MCC).
  • L'identité permanente est chiffrée à l'aide d'une clé publique RSA fournie par l'opérateur. La clé publique est incluse dans un certificat X.509.
  • Le schéma de chiffrement est RSAES-OAEP avec SHA-256 comme fonction de hachage cryptographique. Ce schéma de chiffrement garantit un texte chiffré unique chaque fois qu'il est utilisé, ce qui évite une autre identité persistante pouvant être suivie.
  • La longueur de la clé RSA est de 2 048 bits.
  • La mémoire tampon de chiffrement est de 256 octets.
  • Le texte chiffré est encodé en Base64.
  • La longueur de l'identité permanente chiffrée en sortie est de 344 octets.
Encrypted Permanent Identity = Base64(RSAES-OAEP-SHA-256(<EAP-Method><IMSI>@<NAI Realm>))
Identifiant de clé

L'identifiant de clé est une paire clé/valeur d'attribut facultative que l'opérateur associe à un certificat pour permettre au serveur de localiser la clé privée appropriée lors de l'authentification. Voici un exemple d'identifiant de clé : CertificateSerialNumber=123456. Si l'identifiant de clé est fourni, il est envoyé en clair lors du processus d'authentification.

Modifications apportées aux méthodes d'authentification EAP basées sur la carte SIM

Lorsque la protection de la confidentialité de l'IMSI est activée sur une connexion, le système n'envoie pas l'identité permanente à la réception de EAP-Request/Identity. Il répond plutôt avec une connexion anonyme :

SERVER: EAP-Request/Identity
UE: EAP-Response/Identity AT_IDENTITY=<prefix>|anonymous@<NAI Realm>

<prefix> est facultatif. Si la configuration de l'opérateur enable_eap_method_prefix_bool est définie sur true, le premier caractère de l'identité (avant anonymous) informe le serveur du type de méthode EAP utilisé avant le début de l'échange EAP.

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

Si la configuration de l'opérateur est définie sur false, ce préfixe n'est pas inclus dans le message.

En réponse, le serveur envoie un message EAP-Request/AKA-Identity et le système répond au format suivant :

SERVER: EAP-Request/AKA-Identity AT_ANY_ID_REQ
UE: EAP-Response/AKA-Identity AT_IDENTITY=<prefix>|<Encrypted Permanent Identity>|","|"<attribute>=<value>"

Le premier caractère de l'identité indique au serveur qu'une identité chiffrée est utilisée ou le type de méthode EAP configurée :

  • \0 : Identité permanente chiffrée
  • 0 : EAP-AKA
  • 1 : EAP-SIM
  • 6 : EAP-AKA'

La paire valeur/attribut de l'identifiant de clé est facultative et n'est pas ajoutée à la fin de l'identité permanente chiffrée si elle n'est pas utilisée.

À ce stade, le serveur localise la clé privée à partir de l'identifiant de clé (le cas échéant), déchiffre l'identité chiffrée à l'aide de la clé privée de l'opérateur et poursuit le flux EAP normal.

Une fois l'authentification réussie, le serveur peut fournir une identité de réauthentification rapide ou une identité temporaire (pseudonyme), qui est utilisée lors des connexions ultérieures. Si le serveur ne fournit aucune identité temporaire, le système envoie l'identité chiffrée lors de la connexion suivante.

Récupération, expiration et révocation des certificats de l'opérateur

Si aucun certificat n'est installé dans le système, celui-ci utilise l'URL fournie dans la configuration de l'opérateur imsi_key_download_url_string pour télécharger un certificat à l'aide de la méthode HTTP GET. Le système n'utilise les données mobiles que si la configuration de l'opérateur allow_metered_network_for_cert_download_bool est définie sur true. Sinon, le système télécharge le certificat uniquement lorsqu'une connexion Wi-Fi est disponible.

L'expiration du certificat est appliquée par le système. Le système tente de renouveler les certificats 21 jours avant leur date d'expiration et utilise la même URL pour télécharger le nouveau certificat.

Si le serveur n'est pas en mesure de déchiffrer l'identité chiffrée, il envoie un message EAP-Request/AKA-Notification avec le code AT_NOTIFICATION General Failure (16384) pour mettre fin à l'échange EAP.

Si le certificat est révoqué ou a expiré, le serveur envoie un message EAP-Request/AKA-Notification avec le code AT_NOTIFICATION Certificate Replacement Required (16385) pour mettre fin à l'échange EAP. En réponse, le système applique des heuristiques internes pour déterminer s'il doit supprimer le certificat et tenter d'en télécharger un nouveau à partir de la même URL.

Fournir la clé publique

Fournissez une URL publique vers un serveur, de préférence en utilisant HTTP via TLS, qui héberge le certificat du transporteur, où :

  1. La clé publique et la date d'expiration peuvent être extraites du certificat.
  2. Les informations du serveur sont au format JSON, comme suit :

    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.
    

    Voici un exemple de clé publique.

    {
    "carrier-keys" : [ {
      "key-identifier" : "CertificateSerialNumber=5xxe06d4",
      "public-key" : "-----BEGIN CERTIFICATE-----\r\nTIIDRTCCAi2gAwIBAgIEVR4G1DANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJVUzELMAkGA1UE\r\nCBMCTkExCzAJBgNVBAcTAk5BMQswCQYDVQQKEwJOQTELMAkGA1UECxMCTkExEDAOBgNVBAMTB1Rl\r\nc3RiT6N1/w==\r\n-----END CERTIFICATE-----"
    } ]
    }