'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 הוא מספר שלם (ראו מרשם של פרוטוקול אימות ניתן להרחבה (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 הוא 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-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-----" } ] }