이동통신사 Wi-Fi

이동통신사 Wi-Fi는 이동통신사에서 구현한 Wi-Fi 네트워크에 기기를 자동으로 연결할 수 있는 자동 연결 기능(암호화된 IMSI 사용)으로, Android 9 이상에서 사용할 수 있습니다. 정체가 심하거나 경기장이나 지하철역과 같이 휴대전화 연결 상태가 좋지 않은 지역에서 이동통신사 Wi-Fi는 사용자의 연결성을 개선하고 트래픽을 오프로드하는 데 사용됩니다.

이동통신사 Wi-Fi 기능이 있는 기기는 구성된 이동통신사 Wi-Fi 네트워크(공개키 인증서가 있는 네트워크)에 자동으로 연결됩니다. 사용자가 이동통신사 Wi-Fi 네트워크에서 직접 연결을 끊으면 네트워크가 24시간 동안 블랙리스트에 등록됩니다(자동 연결 안 됨). 사용자는 블랙리스트에 등록된 네트워크에 언제든지 수동으로 연결할 수 있습니다.

이동통신사 Wi-Fi가 구현된 Android 9 이상을 실행하는 기기에서는 이동통신사 Wi-Fi를 통한 자동 연결이 기본적으로 꺼져 있습니다. 기기가 이동통신사 Wi-Fi 네트워크에 처음으로 연결을 시도할 때 사용자에게 알림이 전송됩니다.

구현

이동통신사 Wi-Fi를 구현하려면 기기 제조업체와 이동통신사가 다음을 실행해야 합니다.

제조업체

Android 11 이상을 실행하는 기기의 경우 Wi-Fi 추천 API를 사용하여 각 이동통신사에 Wi-Fi 프로필을 추가합니다.

10 이하를 실행하는 기기의 경우 이동통신사 구성 관리자에서 각 이동통신사의 carrier_wifi_string_array 매개변수를 구성하여 Wi-Fi 프로필을 추가합니다.

  • carrier_wifi_string_array: 각 문자열 항목이 Base64 인코딩 Wi-Fi SSID이고 쉼표로 구분된 EAP 유형인 문자열 배열입니다. 여기서 EAP 유형은 정수입니다(확장성 인증 프로토콜(EAP) 레지스트리 참조). 예를 들어 다음 구성은 EAP-AKA를 사용하는 SOME_SSID_NAMEEAP-SIM을 사용하는 Some_Other_SSID에 관한 것입니다.

    config {
      key: "carrier_wifi_string_array"
      text_array {
        item: "U09NRV9TU0lEX05BTUUK,23"
        item: "U29tZV9PdGhlcl9TU0lECg==,18"
      }
    }
    

이동통신사 구성 관리자에서 각 이동통신사에 관해 다음 매개변수를 구성합니다.

  • 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: IMSI 암호화에 사용된 이동통신사 공개 키를 포함하는 프로토콜이 다운로드되는 URL입니다. 예를 들어 다음 구성은 특정 URL을 제공합니다.

    config {
      key: "imsi_key_download_url_string"
      text_value: "https://www.some_company_name.com:5555/some_directory_name/"
    }
    
  • 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에서는 공개 키 암호화를 사용하여 가입자 영구 ID(IMSI)의 기밀성을 보호합니다. Android는 Wi-Fi의 IMSI 개인 정보 보호 기능에 관한 무선 광대역 연합(WBA) 사양을 구현합니다. 연결에 IMSI 개인 정보 보호 기능이 사용 설정되면 영구 가입자 ID는 무선 업데이트 시 암호화되지 않은 상태로 전송되지 않습니다.

영구 ID 암호화

암호화된 영구 ID의 형식은 다음과 같습니다.

  • 영구 ID는 <EAP-Method><IMSI>@<NAI realm> 형식입니다.
  • EAP-Method 접두어는 인증에 사용되는 EAP 방식을 정의하는 단일 옥텟입니다.
    • 0: EAP-AKA
    • 1: EAP-SIM
    • 6: EAP-AKA'
  • NAI 영역 형식은 wlan.mncXXX.mccYYY.3gppnetwork.org이며 여기서 XXX는 SIM 카드의 모바일 네트워크 코드(MNC)로 대체되고 YYY는 모바일 국가 코드(MCC)로 대체됩니다.
  • 영구 ID는 이동통신사에서 제공하는 RSA 공개 키를 사용하여 암호화됩니다. 공개 키는 X.509 인증서에 포함되어 있습니다.
  • 암호화 체계는 SHA-256이 암호화 해시 함수인 RSAES-OAEP입니다. 이 암호화 체계는 체계가 사용될 때마다 고유한 암호화 텍스트를 보장하므로 추적 가능한 다른 영구 ID를 방지합니다.
  • RSA 키 길이는 2,048비트입니다.
  • 암호화 버퍼는 256바이트입니다.
  • 암호화 텍스트는 Base64로 인코딩됩니다.
  • 암호화된 출력 영구 ID 길이는 344바이트입니다.
Encrypted Permanent Identity = Base64(RSAES-OAEP-SHA-256(<EAP-Method><IMSI>@<NAI Realm>))
키 식별자

키 식별자는 이동통신사에서 인증서에 첨부하여 인증 중에 서버가 적절한 비공개 키를 찾을 수 있도록 하는 선택적 속성 값 쌍입니다. 키 식별자의 예는 CertificateSerialNumber=123456입니다. 키 식별자가 제공되면 인증 프로세스 중 암호화되지 않은 상태로 전송됩니다.

SIM 기반 EAP 인증 방식 수정

연결 시 IMSI 개인 정보 보호 기능이 사용 설정되면 시스템에서 EAP-Request/Identity를 수신할 때 영구 ID를 전송하는 대신 익명 로그인으로 응답합니다.

SERVER: EAP-Request/Identity
UE: EAP-Response/Identity AT_IDENTITY=<prefix>|anonymous@<NAI Realm>

<prefix>는 선택사항입니다. enable_eap_method_prefix_bool 이동통신사 구성이 true로 설정된 경우 ID의 첫 번째 문자(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>"

ID의 첫 번째 문자는 암호화된 ID가 사용되었다는 점 또는 구성된 EAP 방식의 유형을 서버에 알립니다.

  • \0: 암호화된 영구 ID
  • 0: EAP-AKA
  • 1: EAP-SIM
  • 6: EAP-AKA'

키 식별자 속성 값 쌍은 선택사항이며 사용하지 않는 경우 암호화된 영구 ID의 끝에 추가되지 않습니다.

이때 서버는 키 식별자(제공되는 경우)에서 비공개 키를 찾고 이동통신사 비공개 키를 사용하여 암호화된 ID를 복호화하며 일반 EAP 절차를 계속 진행합니다.

인증에 성공하면 서버는 빠른 재인증 ID나 임시 ID(가명)를 제공할 수 있고 이러한 ID는 후속 연결에 사용됩니다. 서버에서 제공하는 임시 ID가 없는 경우 시스템은 후속 연결에서 암호화된 ID를 전송합니다.

이동통신사 인증서 검색, 만료, 취소

시스템에 설치된 인증서가 없는 경우 시스템은 imsi_key_download_url_string 이동통신사 구성에 제공된 URL을 사용하여 HTTP GET 메서드로 인증서를 다운로드합니다. 시스템은 allow_metered_network_for_cert_download_bool 이동통신사 구성이 true로 설정된 경우에만 모바일 데이터를 사용합니다. 그렇게 설정되어 있지 않으면 시스템은 Wi-Fi 연결이 가능할 때만 인증서를 다운로드합니다.

인증서 만료는 시스템에서 적용합니다. 시스템에서는 인증서 만료일 21일 전에 인증서 갱신 시도를 시작하고 동일한 URL을 사용하여 새 인증서를 다운로드합니다.

서버에서 암호화된 ID를 복호화할 수 없는 경우 서버는 AT_NOTIFICATION 코드 General Failure(16384)와 함께 EAP-Request/AKA-Notification 메시지를 전송하여 EAP 교환을 종료합니다.

인증서가 취소되거나 만료된 경우 서버는 AT_NOTIFICATION 코드 Certificate Replacement Required(16385)와 함께 EAP-Request/AKA-Notification 메시지를 전송하여 EAP 교환을 종료합니다. 이렇게 하면 시스템은 내부 휴리스틱을 적용하여 인증서를 삭제할지 여부를 결정하고 동일한 URL에서 새 인증서를 다운로드하려고 시도합니다.

공개 키 제공

다음과 같은 이동통신사 인증서를 호스팅하는 서버의 공개 URL을 제공합니다(가능하면 HTTP over 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-----"
    } ]
    }