Wi-Fi của nhà mạng là một tính năng tự động kết nối (sử dụng IMSI được mã hoá) có trong Android 9 trở lên, cho phép các thiết bị tự động kết nối với mạng Wi-Fi do nhà mạng triển khai. Ở những khu vực có lưu lượng truy cập cao hoặc có vùng phủ sóng di động tối thiểu, chẳng hạn như sân vận động hoặc ga tàu điện ngầm, bạn có thể sử dụng Wi-Fi của nhà mạng để cải thiện trải nghiệm kết nối của người dùng và giảm tải lưu lượng truy cập.
Các thiết bị có tính năng Wi-Fi của nhà mạng sẽ tự động kết nối với các mạng Wi-Fi đã định cấu hình của nhà mạng (các mạng có chứng chỉ khoá công khai). Khi người dùng ngắt kết nối khỏi mạng Wi-Fi của nhà mạng theo cách thủ công, mạng đó sẽ bị đưa vào danh sách chặn trong 24 giờ (không tự động kết nối). Người dùng có thể kết nối theo cách thủ công với các mạng trong danh sách chặn bất cứ lúc nào.
Triển khai
Nhà sản xuất thiết bị và nhà mạng phải làm những việc sau để triển khai Wi-Fi của nhà mạng.
Nhà sản xuất
Đối với các thiết bị chạy Android 11 trở lên, hãy dùng API đề xuất Wi-Fi để thêm hồ sơ Wi-Fi cho mỗi nhà mạng.
Đối với các thiết bị chạy phiên bản 10 trở xuống, hãy thêm hồ sơ Wi-Fi bằng cách định cấu hình tham số carrier_wifi_string_array
cho từng nhà mạng trong trình quản lý cấu hình nhà mạng.
carrier_wifi_string_array
: Một mảng chuỗi, trong đó mỗi mục nhập chuỗi là một SSID Wi-Fi được mã hoá Base64 và một loại EAP được phân tách bằng dấu phẩy, trong đó loại EAP là một số nguyên (tham khảo Sổ đăng ký Giao thức xác thực có thể mở rộng (EAP)). Ví dụ: cấu hình sau đây dành cho SOME_SSID_NAME bằng EAP-AKA và Some_Other_SSID bằng EAP-SIM:config { key: "carrier_wifi_string_array" text_array { item: "U09NRV9TU0lEX05BTUUK,23" item: "U29tZV9PdGhlcl9TU0lECg==,18" } }
Trong trình quản lý cấu hình nhà mạng, hãy định cấu hình các tham số sau cho từng nhà mạng:
imsi_key_availability_int
: Xác định xem khoá dùng để mã hoá IMSI có dùng được cho WLAN (bit 1 được đặt), EPDG (bit 0 được đặt) hay cả hai (cả bit 0 và bit 1 đều được đặt) hay không. Ví dụ: cấu hình sau đây cho biết tính năng mã hoá IMSI có sẵn cho WLAN nhưng không có sẵn cho EPDG:config { key: "imsi_key_availability_int" int_value: 2 }
imsi_key_download_url_string
: URL mà từ đó proto chứa khoá công khai của nhà mạng dùng để mã hoá IMSI được tải xuống. Ví dụ: cấu hình sau đây cung cấp một URL cụ thể: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
: Một cờ cho biết có cho phép tải khoá công khai của nhà mạng xuống qua mạng có đo lượng dữ liệu (di động) hay không. Nếu bạn không đặt cờ này, thì một thiết bị mới không có khả năng kết nối Wi-Fi sẽ không thể kết nối với mạng Wi-Fi của nhà mạng vì thiết bị đó sẽ không được phép tải khoá xuống.config { key: "allow_metered_network_for_cert_download_bool" bool_value: true }
Nhà mạng
Để triển khai Wi-Fi của nhà mạng, nhà mạng phải bật tính năng bảo vệ quyền riêng tư IMSI và cung cấp khoá công khai.
Bảo vệ quyền riêng tư của IMSI
Android bảo vệ tính bảo mật của danh tính vĩnh viễn của người đăng ký (IMSI) bằng phương thức mật mã hoá khoá công khai. Android triển khai quy cách của Liên minh Băng rộng không dây (WBA) cho tính năng Bảo vệ quyền riêng tư IMSI cho Wi-Fi. Khi tính năng bảo vệ quyền riêng tư IMSI được bật cho một kết nối, danh tính thuê bao vĩnh viễn sẽ không được truyền rõ ràng qua sóng.
Mã hoá danh tính vĩnh viễn
Định dạng của danh tính vĩnh viễn đã mã hoá như sau:
- Danh tính vĩnh viễn có định dạng
<EAP-Method><IMSI>@<NAI realm>
. - Tiền tố EAP-Method là một octet duy nhất xác định phương thức EAP được dùng để xác thực:
0
: EAP-AKA1
: EAP-SIM6
: EAP-AKA'
- Định dạng miền NAI là
wlan.mncXXX.mccYYY.3gppnetwork.org
, trong đóXXX
được thay thế bằng mã mạng di động (MNC) của thẻ SIM vàYYY
được thay thế bằng mã quốc gia trên thiết bị di động (MCC). - Danh tính vĩnh viễn được mã hoá bằng khoá công khai RSA do nhà mạng cung cấp. Khoá công khai được đưa vào chứng chỉ X.509.
- Sơ đồ mã hoá là RSAES-OAEP với SHA-256 làm hàm băm mật mã. Lược đồ mã hoá này đảm bảo văn bản mật mã riêng biệt mỗi khi lược đồ được sử dụng, do đó tránh được một danh tính ổn định khác có thể theo dõi.
- Độ dài khoá RSA là 2048 bit.
- Vùng đệm mã hoá là 256 byte.
- Văn bản mật mã được mã hoá bằng Base64.
- Độ dài của danh tính vĩnh viễn đã mã hoá đầu ra là 344 byte.
Encrypted Permanent Identity = Base64(RSAES-OAEP-SHA-256(<EAP-Method><IMSI>@<NAI Realm>))
Giá trị nhận dạng khoá
Giá trị cặp thuộc tính không bắt buộc của mã nhận dạng khoá mà hãng vận chuyển đính kèm vào một chứng chỉ để cho phép máy chủ xác định vị trí khoá riêng tư thích hợp trong quá trình xác thực. CertificateSerialNumber=123456
là một ví dụ về giá trị nhận dạng khoá. Nếu bạn cung cấp giá trị nhận dạng khoá, thì giá trị này sẽ được gửi ở dạng văn bản thuần tuý trong quá trình xác thực.
Sửa đổi phương thức xác thực EAP dựa trên SIM
Khi tính năng bảo vệ quyền riêng tư IMSI được bật trên một kết nối, hệ thống sẽ không gửi danh tính vĩnh viễn khi nhận được EAP-Request/Identity
, thay vào đó, hệ thống sẽ phản hồi bằng một thông tin đăng nhập ẩn danh:
SERVER: EAP-Request/Identity
UE: EAP-Response/Identity AT_IDENTITY=<prefix>|anonymous@<NAI Realm>
<prefix>
là không bắt buộc. Nếu cấu hình nhà mạng enable_eap_method_prefix_bool
được đặt thành true
, thì ký tự đầu tiên của danh tính (trước anonymous
) sẽ thông báo cho máy chủ về loại phương thức EAP được dùng trước khi quá trình trao đổi EAP bắt đầu.
0
: EAP-AKA1
: EAP-SIM6
: EAP-AKA'
Nếu cấu hình nhà mạng được đặt thành false
, thì tiền tố này sẽ không có trong thông báo.
Để phản hồi, máy chủ sẽ gửi một thông báo EAP-Request/AKA-Identity
và hệ thống sẽ phản hồi theo định dạng sau:
SERVER: EAP-Request/AKA-Identity AT_ANY_ID_REQ
UE: EAP-Response/AKA-Identity AT_IDENTITY=<prefix>|<Encrypted Permanent Identity>|","|"<attribute>=<value>"
Ký tự đầu tiên của danh tính sẽ thông báo cho máy chủ rằng một danh tính được mã hoá đang được sử dụng hoặc loại phương thức EAP được định cấu hình:
\0
: Danh tính vĩnh viễn đã mã hoá0
: EAP-AKA1
: EAP-SIM6
: EAP-AKA'
Cặp giá trị thuộc tính mã nhận dạng khoá là không bắt buộc và không được thêm vào cuối danh tính vĩnh viễn đã mã hoá nếu không được sử dụng.
Tại thời điểm này, máy chủ sẽ xác định vị trí khoá riêng tư từ mã nhận dạng khoá (nếu được cung cấp), giải mã danh tính được mã hoá bằng khoá riêng tư của nhà mạng và tiếp tục quy trình EAP thông thường.
Sau khi xác thực thành công, máy chủ có thể cung cấp một danh tính xác thực lại nhanh hoặc một danh tính tạm thời (bút danh) được dùng trong các kết nối tiếp theo. Nếu máy chủ không cung cấp danh tính tạm thời, hệ thống sẽ gửi danh tính đã mã hoá trong kết nối tiếp theo.
Truy xuất, hết hạn và thu hồi chứng chỉ của nhà mạng
Trong trường hợp không có chứng chỉ nào được cài đặt trong hệ thống, hệ thống sẽ sử dụng URL được cung cấp trong cấu hình nhà mạng imsi_key_download_url_string
để tải chứng chỉ xuống bằng phương thức HTTP GET. Hệ thống chỉ sử dụng dữ liệu di động nếu cấu hình nhà mạng allow_metered_network_for_cert_download_bool
được đặt thành true
. Nếu không, hệ thống sẽ chỉ tải chứng chỉ xuống khi có kết nối Wi-Fi.
Hệ thống sẽ thực thi thời hạn hết hiệu lực của chứng chỉ. Hệ thống bắt đầu tìm cách gia hạn chứng chỉ 21 ngày trước ngày hết hạn chứng chỉ và sử dụng cùng một URL để tải chứng chỉ mới xuống.
Trong trường hợp máy chủ không thể giải mã danh tính đã mã hoá, máy chủ sẽ gửi thông báo EAP-Request/AKA-Notification
có mã AT_NOTIFICATION
General Failure
(16384) để chấm dứt quá trình trao đổi EAP.
Trong trường hợp chứng chỉ bị thu hồi hoặc hết hạn, máy chủ sẽ gửi thông báo EAP-Request/AKA-Notification
kèm theo mã AT_NOTIFICATION
Certificate Replacement Required
(16385) để chấm dứt quá trình trao đổi EAP.
Để phản hồi, hệ thống sẽ áp dụng các phương pháp phỏng đoán nội bộ để xác định xem có nên xoá chứng chỉ hay không và tìm cách tải một chứng chỉ mới xuống từ cùng một URL.
Cung cấp khoá công khai
Cung cấp một URL công khai cho một máy chủ (tốt nhất là sử dụng HTTP qua TLS) lưu trữ chứng chỉ của hãng vận chuyển, trong đó:
- Bạn có thể trích xuất khoá công khai và thời gian hết hạn từ chứng chỉ.
Thông tin từ máy chủ ở định dạng JSON như sau:
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.
Sau đây là ví dụ về khoá công khai.
{ "carrier-keys" : [ { "key-identifier" : "CertificateSerialNumber=5xxe06d4", "public-key" : "-----BEGIN CERTIFICATE-----\r\nTIIDRTCCAi2gAwIBAgIEVR4G1DANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJVUzELMAkGA1UE\r\nCBMCTkExCzAJBgNVBAcTAk5BMQswCQYDVQQKEwJOQTELMAkGA1UECxMCTkExEDAOBgNVBAMTB1Rl\r\nc3RiT6N1/w==\r\n-----END CERTIFICATE-----" } ] }