Wi-Fi ของผู้ให้บริการ

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 Config Manager

  • 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"
      }
    }
    

ใน Carrier Config Manager ให้กำหนดค่าพารามิเตอร์ต่อไปนี้สำหรับผู้ให้บริการแต่ละราย

  • imsi_key_availability_int:

    ระบุว่าคีย์ที่ใช้สำหรับการเข้ารหัส IMSI พร้อมใช้งานสำหรับ WLAN (ตั้งค่าบิตที่ 1), EPDG (ตั้งค่าบิตที่ 0) หรือทั้ง 2 อย่าง (ตั้งค่าทั้งบิตที่ 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 realm คือ wlan.mnc<var>XXX</var>.mcc<var>YYY</var>.3gppnetwork.org โดย XXX จะแทนที่ด้วยรหัสระบุเครือข่ายมือถือ (MNC) ของซิมการ์ด และ 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 ที่อิงตามซิม

เมื่อเปิดใช้การคุ้มครองความเป็นส่วนตัวของ 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 เดียวกันเพื่อดาวน์โหลดใบรับรองใหม่

หากเซิร์ฟเวอร์ถอดรหัสข้อมูลประจำตัวที่เข้ารหัสไม่ได้ เซิร์ฟเวอร์จะส่งข้อความ 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 ที่โฮสต์ใบรับรองของผู้ให้บริการ โดยมีเงื่อนไขดังนี้

  1. สามารถดึงคีย์สาธารณะและวันหมดอายุออกจากใบรับรองได้
  2. ข้อมูลจากเซิร์ฟเวอร์อยู่ในรูปแบบ 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-----"
    } ]
    }