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

Carrier Wi-Fi เป็นคุณสมบัติการเชื่อมต่ออัตโนมัติ (โดยใช้ IMSI ที่เข้ารหัส) ที่มีใน Android 9 ขึ้นไปที่ช่วยให้อุปกรณ์เชื่อมต่อกับเครือข่าย Wi-Fi ที่ผู้ให้บริการใช้งานโดยอัตโนมัติ ในพื้นที่ที่มีความแออัดสูงหรือมีสัญญาณโทรศัพท์ครอบคลุมน้อย เช่น สนามกีฬาหรือสถานีรถไฟใต้ดิน สามารถใช้ Wi-Fi ของผู้ให้บริการเพื่อปรับปรุงประสบการณ์การเชื่อมต่อของผู้ใช้และลดการจราจรติดขัดได้

อุปกรณ์ที่มีคุณสมบัติ Wi-Fi ของผู้ให้บริการจะเชื่อมต่อกับเครือข่าย Wi-Fi ของผู้ให้บริการที่กำหนดค่าไว้โดยอัตโนมัติ (เครือข่ายที่มีใบรับรองคีย์สาธารณะ) เมื่อผู้ใช้ยกเลิกการเชื่อมต่อจากเครือข่าย Wi-Fi ของผู้ให้บริการด้วยตนเอง เครือข่ายนั้นจะถูกขึ้นบัญชีดำเป็นเวลา 24 ชั่วโมง (ไม่มีการเชื่อมต่ออัตโนมัติ) ผู้ใช้สามารถเชื่อมต่อกับเครือข่ายที่อยู่ในบัญชีดำด้วยตนเองได้ตลอดเวลา

บนอุปกรณ์ที่ใช้ Android 9 หรือสูงกว่าที่มีการใช้งาน Wi-Fi ของผู้ให้บริการ การเชื่อมต่ออัตโนมัติผ่าน Wi-Fi ของผู้ให้บริการจะถูกปิดตามค่าเริ่มต้น การแจ้งเตือนจะถูกส่งไปยังผู้ใช้เมื่ออุปกรณ์พยายามเชื่อมต่อกับเครือข่าย Wi-Fi ของผู้ให้บริการเป็นครั้งแรก

การนำไปปฏิบัติ

ผู้ผลิตอุปกรณ์และผู้ให้บริการจะต้องดำเนินการต่อไปนี้เพื่อใช้งาน Wi-Fi ของผู้ให้บริการ

ผู้ผลิต

สำหรับอุปกรณ์ที่ใช้ Android 11 ขึ้นไป ให้ใช้ API คำแนะนำ Wi-Fi เพื่อเพิ่มโปรไฟล์ 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 คือออคเต็ตเดียวที่กำหนดวิธี EAP ที่ใช้สำหรับการตรวจสอบสิทธิ์:
    • 0 : EAP-อาคา
    • 1 : EAP-ซิม
    • 6 : EAP-อาคา'
  • รูปแบบขอบเขตของ NAI คือ wlan.mnc XXX .mcc YYY .3gppnetwork.org โดยที่ XXX จะถูกแทนที่ด้วยรหัสเครือข่ายมือถือ (MNC) ของซิมการ์ด และ YYY จะถูกแทนที่ด้วยรหัสประเทศของมือถือ (MCC)
  • ข้อมูลประจำตัวถาวรได้รับการเข้ารหัสโดยใช้กุญแจสาธารณะ RSA ที่ผู้ให้บริการมอบให้ รหัสสาธารณะจะรวมอยู่ในใบรับรอง X.509
  • รูปแบบการเข้ารหัสคือ RSAES-OAEP โดยมี SHA-256 เป็นฟังก์ชันแฮชการเข้ารหัส รูปแบบการเข้ารหัสนี้รับประกันข้อความตัวเลขที่ไม่ซ้ำกันทุกครั้งที่มีการใช้รูปแบบ ดังนั้นจึงหลีกเลี่ยงข้อมูลระบุตัวตนแบบถาวรอื่น ๆ ที่สามารถติดตามได้
  • ความยาวคีย์ RSA คือ 2,048 บิต
  • บัฟเฟอร์การเข้ารหัสคือ 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-อาคา
  • 1 : EAP-ซิม
  • 6 : EAP-อาคา'

ถ้าการกำหนดค่าของผู้ให้บริการถูกตั้งค่าเป็น 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-อาคา
  • 1 : EAP-ซิม
  • 6 : EAP-อาคา'

คู่ค่าแอตทริบิวต์ตัวระบุคีย์เป็นทางเลือกและไม่ได้ต่อท้ายข้อมูลระบุตัวตนถาวรที่เข้ารหัส หากไม่ได้ใช้งาน

ณ จุดนี้ เซิร์ฟเวอร์จะค้นหาคีย์ส่วนตัวจากตัวระบุคีย์ (หากมีให้) ถอดรหัสข้อมูลระบุตัวตนที่เข้ารหัสโดยใช้คีย์ส่วนตัวของผู้ให้บริการ และดำเนินการขั้นตอน EAP ปกติต่อไป

เมื่อการรับรองความถูกต้องสำเร็จ เซิร์ฟเวอร์สามารถจัดเตรียมข้อมูลประจำตัวการตรวจสอบซ้ำอย่างรวดเร็วหรือข้อมูลประจำตัวชั่วคราว (นามแฝง) ซึ่งจะใช้ในการเชื่อมต่อครั้งต่อไป หากเซิร์ฟเวอร์ไม่ได้ระบุข้อมูลประจำตัวชั่วคราว ระบบจะส่งข้อมูลระบุตัวตนที่เข้ารหัสในการเชื่อมต่อครั้งต่อไป

การเรียกใบรับรองผู้ให้บริการ การหมดอายุ และการเพิกถอน

ในกรณีที่ไม่มีการติดตั้งใบรับรองในระบบ ระบบจะใช้ URL ที่ให้ไว้ในการกำหนดค่าผู้ให้บริการ imsi_key_download_url_string เพื่อดาวน์โหลดใบรับรองโดยใช้เมธอด HTTP GET ระบบจะใช้ข้อมูลเซลลูลาร์เฉพาะในกรณีที่การกำหนดค่าของผู้ให้บริการ 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-----"
    } ]
    }