وای فای حامل

Wi-Fi حامل یک ویژگی اتصال خودکار (با استفاده از IMSI رمزگذاری شده) است که در Android 9 و بالاتر موجود است که به دستگاه‌ها اجازه می‌دهد به طور خودکار به شبکه‌های Wi-Fi اجرا شده توسط شرکت مخابراتی متصل شوند. در مناطق پر ازدحام یا با حداقل پوشش سلولی مانند استادیوم یا ایستگاه قطار زیرزمینی، می‌توان از Wi-Fi حامل برای بهبود تجربه اتصال کاربران و تخلیه ترافیک استفاده کرد.

دستگاه‌های دارای ویژگی Wi-Fi شرکت مخابراتی به‌طور خودکار به شبکه‌های Wi-Fi حامل پیکربندی‌شده (شبکه‌هایی با گواهی کلید عمومی) متصل می‌شوند. هنگامی که کاربر به صورت دستی از شبکه Wi-Fi شرکت مخابراتی قطع می شود، شبکه به مدت 24 ساعت در لیست سیاه قرار می گیرد (بدون اتصال خودکار). کاربران می توانند در هر زمان به صورت دستی به شبکه های لیست سیاه متصل شوند.

پیاده سازی

سازندگان دستگاه و شرکت‌های مخابراتی باید برای پیاده‌سازی وای‌فای شرکت مخابراتی موارد زیر را انجام دهند.

تولید کنندگان

برای دستگاه‌های دارای Android 11 و بالاتر، از API پیشنهادی Wi-Fi برای افزودن نمایه‌های Wi-Fi برای هر شرکت مخابراتی استفاده کنید.

برای دستگاه‌های دارای شماره ۱۰ یا پایین‌تر، با پیکربندی پارامتر carrier_wifi_string_array برای هر شرکت مخابراتی در مدیر پیکربندی شرکت مخابراتی، نمایه‌های Wi-Fi را اضافه کنید.

  • carrier_wifi_string_array : یک آرایه رشته ای که در آن هر ورودی رشته یک SSID Wi-Fi با کد Base64 و یک نوع EAP است که با کاما از هم جدا شده است، که در آن نوع EAP یک عدد صحیح است (به رجیستری پروتکل تأیید اعتبار توسعه پذیر (EAP) مراجعه کنید). برای مثال، پیکربندی زیر برای SOME_SSID_NAME با استفاده از EAP-AKA و Some_Other_SSID با استفاده از EAP-SIM است:

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

در مدیر پیکربندی حامل ، پارامترهای زیر را برای هر حامل پیکربندی کنید:

  • imsi_key_availability_int : مشخص می کند که آیا کلید مورد استفاده برای رمزگذاری IMSI برای WLAN (بیت 1 تنظیم شده است)، EPDG (بیت 0 تنظیم شده است) یا هر دو (بیت 0 و بیت 1 تنظیم شده است) در دسترس است. به عنوان مثال، پیکربندی زیر نشان می دهد که رمزگذاری IMSI برای WLAN در دسترس است اما برای EPDG نه:

    config {
      key: "imsi_key_availability_int"
      int_value: 2
    }
    
  • imsi_key_download_url_string : URL که پروتو حاوی کلید عمومی حامل مورد استفاده برای رمزگذاری IMSI از آن دانلود می شود. به عنوان مثال، پیکربندی زیر یک URL خاص را ارائه می دهد:

    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 : پرچمی که نشان می دهد آیا دانلود کلید عمومی حامل از طریق یک شبکه اندازه گیری شده (سلولی) مجاز است یا خیر. اگر این پرچم تنظیم نشود، دستگاه جدید بدون اتصال Wi-Fi نمی‌تواند به شبکه Wi-Fi شرکت مخابراتی متصل شود زیرا اجازه دانلود کلید را ندارد.

    config {
      key: "allow_metered_network_for_cert_download_bool"
      bool_value: true
    }
    

حامل ها

برای پیاده سازی وای فای حامل، اپراتور باید حفاظت از حریم خصوصی IMSI را فعال کرده و یک کلید عمومی ارائه دهد.

حفاظت از حریم خصوصی IMSI

Android از محرمانه بودن هویت دائمی مشترک (IMSI) با استفاده از رمزنگاری کلید عمومی محافظت می کند. اندروید مشخصات Wireless Broadband Alliance (WBA) را برای محافظت از حریم خصوصی IMSI برای Wi-Fi پیاده‌سازی می‌کند. هنگامی که حفاظت از حریم خصوصی IMSI برای یک اتصال فعال است، هویت مشترک دائمی در هوای آزاد مخابره نمی شود.

رمزگذاری هویت دائمی

فرمت هویت دائمی رمزگذاری شده به شرح زیر است:

  • هویت دائمی در قالب <EAP-Method><IMSI>@<NAI realm> است.
  • پیشوند EAP-Method یک octet منفرد است که روش EAP مورد استفاده برای احراز هویت را تعریف می کند:
    • 0 : EAP-AKA
    • 1 : EAP-SIM
    • 6 : EAP-AKA'
  • قالب قلمرو NAI wlan.mnc XXX .mcc YYY .3gppnetwork.org است که در آن XXX با کد شبکه تلفن همراه سیم کارت (MNC) و YYY با کد کشور تلفن همراه (MCC) جایگزین شده است.
  • هویت دائمی با استفاده از کلید عمومی RSA ارائه شده توسط حامل رمزگذاری می شود. کلید عمومی در گواهی X.509 گنجانده شده است.
  • طرح رمزگذاری RSAES-OAEP با SHA-256 به عنوان تابع هش رمزنگاری است. این طرح رمزگذاری، هر بار که از طرح استفاده می‌شود، یک متن رمز منحصربه‌فرد را تضمین می‌کند، بنابراین از هویت پایدار دیگری که قابل ردیابی است جلوگیری می‌کند.
  • طول کلید RSA 2048 بیت است.
  • بافر رمزگذاری 256 بایت است.
  • متن رمز با Base64 کدگذاری شده است.
  • طول هویت دائمی رمزگذاری شده خروجی 344 بایت است.
Encrypted Permanent Identity = Base64(RSAES-OAEP-SHA-256(<EAP-Method><IMSI>@<NAI Realm>))
شناسه کلید

شناسه کلید یک جفت مقدار ویژگی اختیاری است که حامل آن را به یک گواهی متصل می کند تا به سرور اجازه دهد کلید خصوصی مناسب را در حین احراز هویت پیدا کند. نمونه ای از شناسه کلید CertificateSerialNumber=123456 است. اگر شناسه کلید ارائه شده باشد، به عنوان بخشی از فرآیند احراز هویت به صورت پاک ارسال می شود.

تغییرات در روش های احراز هویت EAP مبتنی بر سیم کارت

هنگامی که حفاظت از حریم خصوصی IMSI در یک اتصال فعال است، سیستم پس از دریافت EAP-Request/Identity هویت دائمی را ارسال نمی کند، در عوض با یک ورود ناشناس پاسخ می دهد:

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

<prefix> اختیاری است. اگر پیکربندی حامل enable_eap_method_prefix_bool روی true تنظیم شود، اولین کاراکتر هویت (قبل از anonymous ) به سرور در مورد نوع روش EAP استفاده شده قبل از شروع تبادل EAP اطلاع می دهد.

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

اگر پیکربندی حامل روی false تنظیم شده باشد، این پیشوند در پیام گنجانده نشده است.

در پاسخ، سرور یک پیام EAP-Request/AKA-Identity ارسال می کند و سیستم در قالب زیر پاسخ می دهد:

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

اولین کاراکتر هویت به سرور اطلاع می دهد که از یک هویت رمزگذاری شده استفاده شده است یا نوع روش EAP که پیکربندی شده است:

  • \0 : هویت دائمی رمزگذاری شده
  • 0 : EAP-AKA
  • 1 : EAP-SIM
  • 6 : EAP-AKA'

جفت ارزش ویژگی شناسه کلید اختیاری است و در صورت عدم استفاده به انتهای هویت دائمی رمزگذاری شده اضافه نمی شود.

در این مرحله، سرور کلید خصوصی را از شناسه کلید (در صورت ارائه) مکان یابی می کند، هویت رمزگذاری شده را با استفاده از کلید خصوصی حامل رمزگشایی می کند و جریان عادی EAP را ادامه می دهد.

پس از احراز هویت موفقیت آمیز، سرور می تواند یک هویت احراز هویت مجدد سریع یا یک هویت موقت (نام مستعار) ارائه دهد که در اتصالات بعدی استفاده می شود. اگر هیچ هویت موقتی توسط سرور ارائه نشود، سیستم هویت رمزگذاری شده را در اتصال بعدی ارسال می کند.

بازیابی، انقضا و ابطال گواهی حامل

در مواردی که هیچ گواهی در سیستم نصب نشده باشد، سیستم از URL ارائه شده در پیکربندی حامل imsi_key_download_url_string برای دانلود یک گواهی با استفاده از روش HTTP GET استفاده می کند. سیستم تنها در صورتی از داده های سلولی استفاده می کند که پیکربندی حامل allow_metered_network_for_cert_download_bool روی true تنظیم شده باشد. در غیر این صورت، سیستم گواهی را تنها زمانی دانلود می کند که اتصال Wi-Fi در دسترس باشد.

انقضای گواهینامه توسط سیستم اجرا می شود. سیستم 21 روز قبل از تاریخ انقضای گواهینامه شروع به تلاش برای تمدید گواهی می کند و از همان URL برای دانلود گواهی جدید استفاده می کند.

در صورتی که سرور نتواند هویت رمزگذاری شده را رمزگشایی کند، سرور یک پیام EAP-Request/AKA-Notification با کد AT_NOTIFICATION General Failure (16384) ارسال می کند تا تبادل EAP را خاتمه دهد.

در موردی که گواهی باطل یا منقضی شده باشد، سرور یک پیام EAP-Request/AKA-Notification با کد AT_NOTIFICATION Certificate Replacement Required (16385) ارسال می کند تا تبادل EAP را خاتمه دهد. در پاسخ، سیستم از اکتشافات داخلی استفاده می کند تا تعیین کند که آیا گواهی حذف شود یا خیر و تلاش برای دانلود گواهی جدید از همان URL.

کلید عمومی را ارائه دهید

یک URL عمومی به سروری ارائه دهید، ترجیحاً با استفاده از HTTP بیش از TLS، که میزبان گواهی شرکت مخابراتی است که در آن:

  1. کلید عمومی و انقضا را می توان از گواهی استخراج کرد.
  2. اطلاعات سرور در قالب JSON به شرح زیر است:

    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.
    

    در زیر نمونه ای از کلید عمومی است.

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