Wi-Fi của nhà mạng

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 thiết bị tự động kết nối với các mạng Wi-Fi do nhà mạng triển khai. Ở những khu vực có mức độ tắc nghẽn 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, Wi-Fi của nhà mạng có thể 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 của nhà mạng đã định cấu hình (các mạng có chứng chỉ khoá công khai). Khi người dùng ngắt kết nối thủ công khỏi mạng Wi-Fi của nhà mạng, mạng đó sẽ bị đưa vào danh sách từ chối trong 24 giờ (không tự động kết nối). Người dùng có thể kết nối thủ công với các mạng bị đưa vào danh sách từ chối 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 hồ sơ Wi-Fi cho từng nhà mạng.

Đối với các thiết bị chạy Android 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á bằng 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-AKASome_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). Ví dụ: cấu hình sau đây cho biết rằng tính năng mã hoá IMSI dùng được cho WLAN nhưng không dùng được 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 cờ này không được đặt, thì một 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
    }
    

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ư 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í mật của danh tính vĩnh viễn của thuê bao (IMSI) bằng cách sử dụng mật mã học 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) về tính năng Bảo vệ quyền riêng tư của IMSI cho Wi-Fi. Khi tính năng bảo vệ quyền riêng tư của IMSI được bật cho một kết nối, danh tính vĩnh viễn của thuê bao sẽ không được truyền ở dạng văn bản thuần tuý qua mạng không dây.

Mã hoá danh tính vĩnh viễn

Định dạng của danh tính vĩnh viễn được 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-AKA
    • 1: EAP-SIM
    • 6: EAP-AKA'
  • Định dạng miền NAI là wlan.mnc<var>XXX</var>.mcc<var>YYY</var>.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).
  • 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ã. Sơ đồ mã hoá này đảm bảo một văn bản mật mã duy nhất mỗi khi sơ đồ được sử dụng, nhờ đó tránh được một danh tính liên tục khác có thể theo dõi được.
  • Độ dài khoá RSA là 2048 bit.
  • Bộ đệm mã hoá là 256 byte.
  • Văn bản mật mã được mã hoá bằng Base64.
  • Độ dài danh tính vĩnh viễn được 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 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 giá trị nhận dạng khoá được cung cấp, thì giá trị đó sẽ được gửi ở dạng văn bản thuần tuý trong quá trình xác thực.

Sửa đổi đối với các 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 cho 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, mà sẽ phản hồi bằng 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-AKA
  • 1: EAP-SIM
  • 6: 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 đưa vào thông báo.

Để phản hồi, máy chủ sẽ gửi thông báo EAP-Request/AKA-Identity và hệ thống sẽ phản hồi ở đị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 được mã hoá
  • 0: EAP-AKA
  • 1: EAP-SIM
  • 6: EAP-AKA'

Cặp giá trị thuộc tính giá trị nhận dạng khoá là không bắt buộc và không được nối vào cuối danh tính vĩnh viễn được 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ừ giá trị 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 danh tính xác thực lại nhanh hoặc 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 được 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

Nếu không có chứng chỉ nào được cài đặt trong hệ thống, thì 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 GET của HTTP. 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 cố gắng gia hạn chứng chỉ 21 ngày trước ngày chứng chỉ hết hạn và sử dụng cùng một URL để tải chứng chỉ mới xuống.

Nếu máy chủ không thể giải mã danh tính được mã hoá, thì 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.

Nếu chứng chỉ bị thu hồi hoặc hết hạn, thì máy chủ sẽ gửi 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 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 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áy chủ, tốt nhất là sử dụng HTTP qua TLS, lưu trữ chứng chỉ của nhà mạng, trong đó:

  1. Bạn có thể trích xuất khoá công khai và thời gian hết hạn từ chứng chỉ.
  2. 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-----"
    } ]
    }