Wi-Fi của nhà mạng là một tính năng tự động kết nối (sử dụng IMSI đã 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 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 mạng Wi-Fi của nhà mạng đã định cấu hình (mạng có chứng chỉ khoá công khai). Khi người dùng ngắt kết nối theo cách thủ công khỏi mạng Wi-Fi của nhà mạng, mạng đó sẽ bị đưa vào danh sách đen 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 bị đưa vào danh sách đen 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 sử dụng API đề xuất Wi-Fi để thêm cấu hình Wi-Fi cho từng nhà mạng.
Đối với các thiết bị chạy 10 trở xuống, hãy thêm cấu hình 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 của 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 mở rộng (EAP)). Ví dụ: cấu hình sau đây là dành cho SOME_SSID_NAME sử dụng EAP-AKA và Some_Other_SSID sử dụ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ó sẵn cho WLAN (bit 1 được đặt), EPDG (bit 0 được đặt) hay cả hai (cả bit 0 và bit 1 đã được đặt). Ví dụ: cấu hình sau đây cho biết rằng 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 tải proto chứa khoá công khai của nhà mạng dùng để mã hoá IMSI. 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
: Cờ cho biết liệu 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, thiết bị mới không có 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 }
Mạng di độ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ư của 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 mã nhận dạng vĩnh viễn của người đăng ký (IMSI) bằng phương thức mã hoá khoá công khai. Android triển khai thông số kỹ thuật của Liên minh băng thông rộng không dây (WBA) để Bảo vệ quyền riêng tư của IMSI cho Wi-Fi. Khi bạn bật tính năng bảo vệ quyền riêng tư của IMSI cho một kết nối, danh tính người đăng ký cố định sẽ không được truyền qua mạng không dây ở dạng thô.
Mã hoá danh tính vĩnh viễn
Định dạng của danh tính cố định đã mã hoá như sau:
- Giá trị nhận dạng cố định 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 dùng để xác thực:
0
: EAP-AKA1
: EAP-SIM6
: EAP-AKA'
- Định dạng vùng 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ã di động quốc gia (MCC). - Giá trị nhận dạng cố định đượ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.
- Lược đồ 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ã duy nhấ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ể được theo dõi.
- Độ dài khoá RSA là 2048 bit.
- Vùng đệm mã hoá có kích thước 256 byte.
- Văn bản thuật toán mật mã được mã hoá bằng Base64.
- Chiều dài danh tính cố định đã 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ị nhận dạng khoá là một cặp giá trị thuộc tính không bắt buộc mà nhà mạng đí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. Ví dụ về giá trị nhận dạng khoá là CertificateSerialNumber=123456
. 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 thô 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ư của IMSI được bật trên một kết nối, hệ thống sẽ không gửi danh tính cố định khi nhận được EAP-Request/Identity
, thay vào đó, hệ thống sẽ phản hồi bằng một lượt đă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 của 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 sử 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 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 mã nhận dạng sẽ thông báo cho máy chủ về việc sử dụng mã nhận dạng đã mã hoá hoặc loại phương thức EAP được định cấu hình:
\0
: Thông tin nhận dạng vĩnh viễn đã mã hoá0
: EAP-AKA1
: EAP-SIM6
: EAP-AKA'
Bạn không bắt buộc phải sử dụng cặp giá trị thuộc tính của khoá nhận dạng và không được thêm vào phần cuối của 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 khoá riêng tư từ giá trị nhận dạng khoá (nếu được cung cấp), giải mã danh tính đã 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, thì hệ thống sẽ gửi danh tính đã mã hoá trong lần 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 mạng di động imsi_key_download_url_string
để tải xuống chứng chỉ 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 việc hết hạn 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 một thông báo EAP-Request/AKA-Notification
có 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ỉ và cố gắng tải một chứng chỉ mới xuống từ cùng một URL hay không.
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, nơi lưu trữ chứng chỉ của nhà mạng 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ủ có đị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-----" } ] }