Réseau Wi-Fi de l'opérateur

Le Wi-Fi de l'opérateur est une fonctionnalité de connexion automatique (à l'aide d'un 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 de forte congestion ou avec une couverture cellulaire minimale, comme un stade ou une gare 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'un opérateur, le réseau est placé sur la liste noire pendant 24 heures (aucune connexion automatique). Les utilisateurs peuvent se connecter manuellement aux réseaux de la liste de blocage à 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 exécutant 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 dans lequel chaque entrée de chaîne est un SSID Wi-Fi encodé en base64 et un type EAP séparé par une virgule, où le type EAP est un entier (reportez-vous au registre du protocole EAP (Extensible Authentication Protocol)). Par exemple, la configuration suivante est destinée à SOME_SSID_NAME utilisant EAP-AKA et Some_Other_SSID utilisant 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 de l'IMSI est disponible pour le WLAN (bit 1 défini), l'EPDG (bit 0 défini) ou les deux (les bits 0 et 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 protocole contenant la clé publique de l'opérateur utilisé pour le chiffrement de l'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 indiquant si le téléchargement de la clé publique de l'opérateur doit être autorisé sur un réseau limité (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, l'opérateur 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 (IMSI) d'un abonné à l'aide de la cryptographie à clé publique. Android implémente les spécifications 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é de l'IMSI est activée pour une connexion, l'identité permanente de l'abonné n'est pas transmise en clair par radio.

Chiffrement permanent de l'identité

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 de domaine NAI est wlan.mncXXX.mccYYY.3gppnetwork.org, où XXX est remplacé par le mobile network code (MNC) de la carte SIM et YYY est remplacé 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é, évitant ainsi 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 de 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 valeur d'attribut facultative que le transporteur 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 dans le cadre 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 par une connexion anonyme:

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

<prefix> est facultatif. Si la configuration du transporteur 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ée avant le début de l'échange EAP.

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

Si la configuration du transporteur 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 si une identité chiffrée est utilisée ou le type de méthode EAP configuré:

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

La paire de valeurs d'attributs d'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 recherche 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 du transporteur 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 dans les 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 du transporteur imsi_key_download_url_string pour télécharger un certificat à l'aide de la méthode GET HTTP. Le système n'utilise les données mobiles que si la configuration du transporteur allow_metered_network_for_cert_download_bool est définie sur true. Sinon, le système ne télécharge le certificat que lorsqu'une connexion Wi-Fi est disponible.

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

Si le serveur ne parvient pas à 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 arrivé à expiration, 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 de télécharger un nouveau certificat à partir de la même URL.

Fournir la clé publique

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

  1. La clé publique et l'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-----"
    } ]
    }