'Wi-Fi של ספק' היא תכונה של חיבור אוטומטי (באמצעות IMSI מוצפן) שזמינה ב-Android מגרסה 9 ומעלה ומאפשרת למכשירים להתחבר באופן אוטומטי לרשתות Wi-Fi שהוטמעו על ידי הספק. באזורים עם עומס גבוה או עם כיסוי סלולרי מינימלי, כמו אצטדיון או תחנת רכבת תת-קרקעית, אפשר להשתמש ב-Wi-Fi של ספק כדי לשפר את חוויית החיבור של המשתמשים ולצמצם את עומס התנועה.
מכשירים עם התכונה 'Wi-Fi של ספק' מתחברים באופן אוטומטי לרשתות Wi-Fi של ספק שהוגדרו (רשתות עם אישור של מפתח ציבורי). כשמשתמש מתנתק באופן ידני מרשת Wi-Fi של ספק, הרשת מתווספת לרשימת הרשתות האסורות למשך 24 שעות (אין חיבור אוטומטי). המשתמשים יכולים להתחבר באופן ידני לרשתות ברשימת האסור בכל שלב.
הטמעה
יצרני מכשירים וחברות סלולר צריכים לבצע את הפעולות הבאות כדי להטמיע את Wi-Fi של ספק הסלולר.
יצרנים
במכשירים עם Android מגרסה 11 ואילך, תוכלו להוסיף פרופילי Wi-Fi לכל ספק ב-Wi-Fi Offers API.
במכשירים עם Android מגרסה 10 ואילך, מוסיפים פרופילי Wi-Fi על ידי הגדרת הפרמטר carrier_wifi_string_array
לכל ספק במנהל ההגדרות של הספק.
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 שממנה מתבצע ההורדה של ה-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-AKA1
: EAP-SIM6
: EAP-AKA
- הפורמט של תחום ה-NAI הוא
wlan.mncXXX.mccYYY.3gppnetwork.org
, כאשרXXX
מוחלף בקוד הרשת הסלולרית של כרטיס ה-SIM (MNC) ו-YYY
מוחלף בקוד המדינה של הרשת הסלולרית (MCC). - הזהות הקבועה מוצפנת באמצעות מפתח ציבורי מסוג RSA שסופק על ידי הספק. המפתח הציבורי כלול באישור X.509.
- סכמת ההצפנה היא RSAES-OAEP עם SHA-256 כפונקציית הגיבוב (hash) הקריפטוגרפית. תוכנית ההצפנה הזו מבטיחה טקסט הצפנה ייחודי בכל פעם שמשתמשים בתוכנית, וכך נמנעת זהות קבועה נוספת שאפשר לעקוב אחריה.
- האורך של מפתח ה-RSA הוא 2,048 ביט.
- נפח האחסון הזמני של ההצפנה הוא 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-AKA1
: EAP-SIM6
: 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-AKA1
: EAP-SIM6
: EAP-AKA'
צמד הערכים של המאפיין של מזהה המפתח הוא אופציונלי, והוא לא מצורף לסוף הזהות הקבועה המוצפנת אם היא לא בשימוש.
בשלב הזה, השרת מאתר את המפתח הפרטי לפי מזהה המפתח (אם הוא סופק), מפענח את הזהות המוצפנת באמצעות המפתח הפרטי של הספק וממשיך בתהליך הרגיל של EAP.
לאחר אימות מוצלח, השרת יכול לספק זהות לאימות מחדש מהיר או זהות זמנית (פסבדוֹנים), שתשמש בחיבורים הבאים. אם השרת לא מספק זהויות זמניות, המערכת שולחת את הזהות המוצפנת בחיבור הבא.
אחזור, תפוגה וביטול של אישור ספק
אם לא מותקן אישור במערכת, המערכת משתמשת בכתובת ה-URL שצוינה בהגדרות הספק של imsi_key_download_url_string
כדי להוריד אישור באמצעות שיטת ה-GET של HTTP. המערכת משתמשת בחבילת הגלישה רק אם ההגדרה של ספק הנתונים 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, שמארח את האישור של הספק, כאשר:
- אפשר לחלץ מהאישור את המפתח הציבורי ואת תאריך התפוגה.
המידע מהשרת מגיע בפורמט 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-----" } ] }