Carrier 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 לכל ספק.
במכשירים עם גרסה 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 מוגדר), ל-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 }
ספקים
כדי להטמיע 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.mncXXX.mccYYY.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
הספק כדי להוריד אישור באמצעות שיטת ה-GET של HTTP. המערכת משתמשת בחבילת גלישה רק אם הגדרת הספק allow_metered_network_for_cert_download_bool
מוגדרת לערך true
. אחרת, המערכת תוריד את האישור רק כשהחיבור ל-Wi-Fi יהיה זמין.
המערכת אוכפת את תוקף האישור. המערכת מתחילה לנסות לחדש את האישורים 21 ימים לפני תאריך התפוגה של האישור, ומשתמשת באותה כתובת URL כדי להוריד את האישור החדש.
אם השרת לא מצליח לפענח את הזהות המוצפנת, הוא שולח הודעה עם קוד AT_NOTIFICATION
(16384) כדי לסיים את חילופי הנתונים של EAP.EAP-Request/AKA-Notification
General Failure
אם האישור בוטל או שתוקפו פג, השרת שולח הודעת EAP-Request/AKA-Notification
עם קוד AT_NOTIFICATION
(16385) כדי לסיים את חילופי הנתונים של EAP.Certificate Replacement Required
בתגובה, המערכת מפעילה היוריסטיקה פנימית כדי לקבוע אם להסיר את האישור ולנסות להוריד אישור חדש מאותו כתובת 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-----" } ] }