وای فای حامل

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

دستگاه‌هایی که دارای ویژگی وای‌فای اپراتور هستند، به‌طور خودکار به شبکه‌های وای‌فای پیکربندی‌شده اپراتور (شبکه‌هایی با گواهی کلید عمومی) متصل می‌شوند. هنگامی که کاربر به‌صورت دستی از شبکه وای‌فای اپراتور جدا می‌شود، آن شبکه به مدت ۲۴ ساعت در فهرست ممنوعه قرار می‌گیرد (اتصال خودکار وجود ندارد). کاربران می‌توانند در هر زمانی به‌صورت دستی به شبکه‌های ممنوعه متصل شوند.

پیاده‌سازی

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

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

برای دستگاه‌هایی که اندروید ۱۱ و بالاتر دارند، از API پیشنهاد وای‌فای برای اضافه کردن پروفایل‌های وای‌فای برای هر اپراتور استفاده کنید.

برای دستگاه‌هایی که اندروید ۱۰ یا پایین‌تر دارند، با پیکربندی پارامتر carrier_wifi_string_array برای هر اپراتور در carrier config manager، پروفایل‌های Wi-Fi را اضافه کنید.

  • carrier_wifi_string_array :

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

    config {
      key: "allow_metered_network_for_cert_download_bool"
      bool_value: true
    }
    

حامل‌ها

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

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

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

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

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

  • هویت دائمی در قالب <EAP-Method><IMSI>@<NAI realm> است.
  • پیشوند EAP-Method یک هشت‌تایی واحد است که روش EAP مورد استفاده برای احراز هویت را تعریف می‌کند:
    • 0 : EAP-AKA
    • 1 : سیم‌کارت EAP
    • 6 : EAP-معروف به "
  • قالب قلمرو NAI به صورت wlan.mnc<var>XXX</var>.mcc<var>YYY</var>.3gppnetwork.org است که در آن XXX با کد شبکه تلفن همراه سیم کارت (MNC) و YYY با کد کشور تلفن همراه (MCC) جایگزین می‌شود.
  • هویت دائمی با استفاده از یک کلید عمومی RSA که توسط اپراتور ارائه می‌شود، رمزگذاری می‌شود. این کلید عمومی در یک گواهی X.509 گنجانده شده است.
  • طرح رمزگذاری RSAES-OAEP با تابع هش رمزنگاری SHA-256 است. این طرح رمزگذاری، هر بار که از این طرح استفاده می‌شود، یک متن رمز منحصر به فرد را تضمین می‌کند و در نتیجه از یک هویت پایدار دیگر که قابل ردیابی است، جلوگیری می‌کند.
  • طول کلید RSA برابر با 2048 بیت است.
  • بافر رمزگذاری ۲۵۶ بایت است.
  • متن رمز با Base64 کدگذاری شده است.
  • طول شناسه دائمی رمزگذاری شده خروجی ۳۴۴ بایت است.
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 تنظیم شده باشد، اولین کاراکتر identity (قبل از anonymous ) قبل از شروع تبادل EAP، نوع روش EAP مورد استفاده را به سرور اطلاع می‌دهد.

  • 0 : EAP-AKA
  • 1 : سیم‌کارت EAP
  • 6 : EAP-معروف به "

اگر پیکربندی اپراتور روی 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
  • 6 : EAP-معروف به "

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

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

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

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

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

انقضای گواهی توسط سیستم اعمال می‌شود. سیستم ۲۱ روز قبل از تاریخ انقضای گواهی، تلاش برای تمدید گواهی‌ها را آغاز می‌کند و از همان 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-----"
    } ]
    }