Wi-Fi של ספק הסלולר היא תכונה של חיבור אוטומטי (באמצעות IMSI מוצפן) שזמינה ב-Android מגרסה 9 ומעלה. התכונה מאפשרת למכשירים להתחבר אוטומטית לרשתות Wi-Fi שהוטמעו על ידי ספק הסלולר. באזורים עם עומס גבוה או עם כיסוי סלולרי מינימלי, כמו אצטדיון או תחנת רכבת תחתית, רשת Wi-Fi של ספק הסלולר יכולה לשפר את חוויית הקישוריות של המשתמשים ולהפחית את עומס התנועה.
מכשירים עם התכונה 'Wi-Fi של ספק' מתחברים אוטומטית לרשתות Wi-Fi של ספק שהוגדרו (רשתות עם אישור של מפתח ציבורי). כשמשתמש מתנתק באופן ידני מרשת Wi-Fi של ספק סלולר, הרשת נכנסת לרשימת חסימה למשך 24 שעות (אין חיבור אוטומטי). המשתמשים יכולים להתחבר לרשתות שנכללות ברשימת החסימה באופן ידני בכל שלב.
הטמעה
יצרני מכשירים וספקי סלולר צריכים לבצע את הפעולות הבאות כדי להטמיע Wi-Fi של ספק סלולר.
יצרנים
במכשירים עם Android מגרסה 11 ואילך, אפשר להשתמש ב-Wi-Fi suggestion API כדי להוסיף פרופילים של Wi-Fi לכל ספק.
במכשירים עם Android מגרסה 10 ומטה, מוסיפים פרופילים של Wi-Fi על ידי הגדרת הפרמטר carrier_wifi_string_array לכל ספק בכלי לניהול הגדרות של ספקים.
carrier_wifi_string_array:מערך מחרוזות שבו כל רשומה היא SSID של Wi-Fi בקידוד Base64 וסוג EAP שמופרדים באמצעות פסיק, כאשר סוג ה-EAP הוא מספר שלם (ראו Extensible Authentication Protocol (EAP) Registry). לדוגמה, התצורה הבאה היא עבור SOME_SSID_NAME באמצעות EAP-AKA ועבור Some_Other_SSID באמצעות EAP-SIM:
config { key: "carrier_wifi_string_array" text_array { item: "U09NRV9TU0lEX05BTUUK,23" item: "U29tZV9PdGhlcl9TU0lECg==,18" } }
בcarrier config manager, מגדירים את הפרמטרים הבאים לכל ספק:
imsi_key_availability_int:מציין אם המפתח שמשמש להצפנת IMSI זמין ל-WLAN (הביט 1 של 0x0A מוגדר), ל-EPDG (הביט 0 מוגדר) או לשניהם (הביט 0 והביט 1 מוגדרים). לדוגמה, ההגדרה הבאה מציינת שהצפנת IMSI זמינה עבור WLAN אבל לא עבור EPDG:
config { key: "imsi_key_availability_int" int_value: 2 }imsi_key_download_url_string:כתובת ה-URL שממנה מורידים את פרוטוקול ה-proto שמכיל את המפתח הציבורי של הספק שמשמש להצפנת 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 }
ספקים
כדי להטמיע Wi-Fi של ספק, הספק צריך להפעיל הגנה על פרטיות IMSI ולספק מפתח ציבורי.
הגנה על הפרטיות של IMSI
Android מגן על הסודיות של הזהות הקבועה של המנוי (IMSI) באמצעות קריפטוגרפיה של מפתח ציבורי. מערכת Android מטמיעה את המפרט של Wireless Broadband Alliance (WBA) בנושא הגנה על פרטיות IMSI ב-Wi-Fi. כשההגדרה 'הגנה על פרטיות של IMSI' מופעלת בחיבור, זהות המנוי הקבועה לא מועברת בגלוי באוויר.
הצפנה קבועה של הזהות
הפורמט של הזהות הקבועה המוצפנת הוא:
- הזהות הקבועה היא בפורמט
<EAP-Method><IMSI>@<NAI realm>. - הקידומת EAP-Method היא אוקטט יחיד שמגדיר את שיטת ה-EAP שמשמשת לאימות:
-
0: EAP-AKA -
1: EAP-SIM -
6: EAP-AKA'
-
- הפורמט של תחום NAI הוא
wlan.mnc<var>XXX</var>.mcc<var>YYY</var>.3gppnetwork.orgכאשרXXXמוחלף בקוד הרשת הסלולרית (MNC) של כרטיס ה-SIM ו-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 מבוססות SIM
כשההגנה על פרטיות 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 כדי להוריד אישור באמצעות שיטת אחזור נתונים. המערכת משתמשת בחבילת הגלישה רק אם
ההגדרה של allow_metered_network_for_cert_download_bool הספק היא
true. אחרת, המערכת מורידה את האישור רק כשיש חיבור Wi-Fi.
המערכת אוכפת את התוקף של האישורים. המערכת מתחילה לנסות לחדש את האישורים 21 ימים לפני תאריך התפוגה של האישור, ומשתמשת באותה כתובת URL כדי להוריד את האישור החדש.
אם השרת לא מצליח לפענח את הזהות המוצפנת, הוא שולח הודעה עם קוד AT_NOTIFICATION (16384) כדי לסיים את חילופי הנתונים ב-EAP.EAP-Request/AKA-NotificationGeneral Failure
אם האישור בוטל או שתוקפו פג, השרת שולח הודעה עם קוד AT_NOTIFICATIONCertificate Replacement Required (16385) כדי לסיים את חילופי הנתונים של EAP.EAP-Request/AKA-Notification בתגובה, המערכת מפעילה היוריסטיקה פנימית כדי לקבוע אם להסיר את האישור ולנסות להוריד אישור חדש מאותה כתובת URL.
הזנת המפתח הציבורי
צריך לספק כתובת URL ציבורית לשרת, רצוי להשתמש ב-HTTP over TLS, שמארח את האישור של הספק, כאשר:
- אפשר לחלץ את המפתח הציבורי ואת תאריך התפוגה מהאישור.
המידע מהשרת הוא בפורמט 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-----" } ] }