Wi-Fi de l'opérateur

Carrier Wi-Fi est une fonctionnalité de connexion automatique (utilisant IMSI crypté) disponible dans Android 9 et versions ultérieures qui permet aux appareils de se connecter automatiquement aux réseaux Wi-Fi mis en œuvre par l'opérateur. Dans les zones très encombrées ou avec une couverture cellulaire minimale, comme un stade ou une gare souterraine, le Wi-Fi opérateur peut être utilisé pour améliorer l'expérience de connectivité des utilisateurs et pour décharger le trafic.

Les appareils dotés de la fonction 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 (pas de connexion automatique). Les utilisateurs peuvent se connecter manuellement aux réseaux sur liste noire à tout moment.

Sur les appareils fonctionnant sous Android 9 ou version ultérieure avec le Wi-Fi de l'opérateur implémenté, la connexion automatique via le Wi-Fi de l'opérateur est désactivée par défaut. Une notification est envoyée à l'utilisateur lorsque l'appareil tente de se connecter pour la première fois à un réseau Wi-Fi d'opérateur.

Mise en œuvre

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

Fabricants

Pour les appareils exécutant Android 11 et versions ultérieures, utilisez l' API de suggestion Wi-Fi pour ajouter des profils Wi-Fi pour chaque opérateur.

Pour les appareils exécutant 10 ou moins, 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 : un tableau de chaînes dans lequel chaque entrée de chaîne est un SSID Wi-Fi codé en base64 et un type EAP séparé par une virgule, où le type EAP est un entier (reportez-vous au registre du protocole d'authentification extensible (EAP) ). Par exemple, la configuration suivante concerne 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 : identifie si la clé utilisée pour le cryptage IMSI est disponible pour WLAN (le bit 1 est défini), EPDG (le bit 0 est défini) ou les deux (le bit 0 et le bit 1 sont définis). Par exemple, la configuration suivante indique que le cryptage 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 est téléchargé le proto contenant la clé publique du support utilisé pour le chiffrement IMSI. 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 : Un indicateur indiquant s'il faut autoriser le téléchargement de la clé publique de l'opérateur sur un réseau (cellulaire) mesuré. 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
    }
    

Transporteurs

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

Protection de la confidentialité 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 Wireless Broadband Alliance (WBA) pour la protection de la confidentialité 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.

Cryptage permanent de l'identité

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

  • L'identité permanente est au format <EAP-Method><IMSI>@<NAI realm> .
  • Le préfixe EAP-Method est un seul octet 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.mnc XXX .mcc YYY .3gppnetwork.orgXXX est remplacé par le code de réseau mobile (MNC) de la carte SIM et YYY est remplacé par l'indicatif de pays mobile (MCC).
  • L'identité permanente est crypté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 cryptage est RSAES-OAEP avec SHA-256 comme fonction de hachage cryptographique. Ce schéma de chiffrement garantit un texte chiffré unique à chaque fois que le schéma est utilisé, évitant ainsi une autre identité persistante pouvant être traçable.
  • La longueur de la clé RSA est de 2048 bits.
  • Le tampon de chiffrement est de 256 octets.
  • Le texte chiffré est codé 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>))
Identificateur de clé

L'identifiant de clé est une paire de valeurs d'attribut facultative que l'opérateur attache à un certificat pour permettre au serveur de localiser la clé privée appropriée lors de l'authentification. Un exemple d’identifiant de clé est CertificateSerialNumber=123456 . Si l'identifiant de clé est fourni, il est envoyé en clair dans le cadre du processus d'authentification.

Modifications des méthodes d'authentification EAP basées sur SIM

Lorsque la protection de la confidentialité IMSI est activée sur une connexion, le système n'envoie pas l'identité permanente à la réception d' EAP-Request/Identity , mais répond par 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ée 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é informe le serveur soit qu'une identité chiffrée est utilisée, soit du type de méthode EAP configurée :

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

La paire de valeurs d’attribut 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 localise la clé privée à partir de l'identifiant de clé (si fourni), 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 aucune identité temporaire n'est fournie par le serveur, le système envoie l'identité cryptée lors de la connexion suivante.

Récupération, expiration et révocation du certificat de transporteur

Dans le cas où aucun certificat n'est installé dans le système, le système 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 HTTP GET. Le système utilise les données cellulaires uniquement 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 imposé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.

Dans le cas où le serveur ne parvient pas à déchiffrer l'identité cryptée, le serveur envoie un message EAP-Request/AKA-Notification avec le code AT_NOTIFICATION General Failure (16384) pour mettre fin à l'échange EAP.

Dans le cas où le certificat est révoqué ou 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 une heuristique interne 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 en utilisant HTTP sur TLS, qui héberge le certificat de l'opérateur 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.
    

    Ce qui suit est 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-----"
    } ]
    }