Passpoint(热点 2.0)

Passpoint 是一种 Wi-Fi 联盟 (WFA) 协议,可帮助用户发现 Wi-Fi 热点并完成身份验证以访问互联网。Passpoint 采用热点 2.0 技术。

设备支持

为了支持 Passpoint,设备制造商需要实现 hardware/interfaces/wifi/supplicant/1.0 或更高版本。Android 开源项目 (AOSP) 中提供的 Wi-Fi HAL 接口设计语言 (HIDL) 为请求方定义了一个 HAL。请求方支持 802.11u 标准,特别是网络发现和选择功能,例如通用通告服务 (GAS) 和接入网络查询协议 (ANQP)。

实现

设备制造商需要提供框架和 HAL/固件支持:

  • 框架:启用 Passpoint(需要功能标记)
  • 固件:支持 802.11u

要支持 Passpoint,请实现 Wi-Fi HAL 并为 Passpoint 启用功能标记。在位于 device/<oem>/<device>device.mk 中,修改 PRODUCT_COPY_FILES 环境变量,以便支持 Passpoint 功能:

PRODUCT_COPY_FILES +=
    frameworks/native/data/etc/android.hardware.wifi.passpoint.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.wifi.passpoint.xml
    

支持 Passpoint 的所有其他要求都包含在 AOSP 中。

验证

要验证 Passpoint 功能的实现情况,请使用 Android 通讯测试套件 (ACTS) 中提供的一组单元测试和集成测试。

单元测试

运行以下 Passpoint 软件包单元测试。

服务测试:

% ./frameworks/opt/net/wifi/tests/wifitests/runtests.sh -e package
    com.android.server.wifi.hotspot2
    

Manager 测试:

% ./frameworks/base/wifi/tests/runtests.sh -e package android.net.wifi.hotspot2
    

集成测试 (ACTS)

ACTS Passpoint 测试套件(位于 tools/test/connectivity/acts/tests/google/wifi/WifiPasspointTest.py)可实现一组功能测试。

Passpoint R1

自从 Android 6.0 支持从网络下载包含配置文件和凭据信息的特殊文件来配置 Passpoint R1(第 1 版)凭据,Android 就一直支持 Passpoint R1。客户端会自动启动用于 Wi-Fi 信息的特殊安装程序,并允许用户先查看各部分信息,然后再决定接受或拒绝内容。

文件中包含的配置文件信息用于与从已启用 Passpoint 的接入点检索到的数据进行匹配,并且系统会自动将凭据应用于任何匹配的网络。

Android 参考实现支持 EAP-TTLS、EAP-TLS、EAP-SIM、EAP-AKA 和 EAP-AKA'。

下载机制

Passpoint 配置文件必须托管在网络服务器上,并且应使用 TLS (HTTPS) 进行保护,因为其中可能包含明文密码或私钥数据。内容由经过封装的多部分 MIME 文本(采用 UTF-8 格式)组成,并按照 RFC-2045 第 6.8 节所述以 base64 编码形式进行编码。

客户端使用以下 HTTP 标头字段在设备上自动启动 Wi-Fi 安装程序:

  • Content-Type 必须设置为 application/x-wifi-config
  • Content-Transfer-Encoding 必须设置为 base64
  • 不得设置 Content-Disposition

用于检索文件的 HTTP 方法必须为 GET。只要浏览器中的 HTTP GET 收到包含以上 MIME 标头的响应,系统就会启动安装应用。必须通过点按按钮等 HTML 元素来触发下载(不支持自动重定向到下载网址)。此行为仅适用于 Google Chrome;其他网络浏览器不一定会提供类似功能。

文件组成

以 base64 编码的内容必须由 Content-Typemultipart/mixed 的 MIME 多部分内容组成。以下部分构成了多部分内容的各个部分。

部分 内容类型(较少引用) 是否必需 说明
配置文件 application/x-passpoint-profile 始终必需 采用 OMA-DM SyncML 格式的负载,包含用于 HomeSPCredential 且采用 Passpoint R1 PerProviderSubscription 格式的 MO。
信任证书 application/x-x509-ca-cert 对于 EAP-TLS 和 EAP-TTLS 是必需的 一个以 base64 编码的 X.509v3 证书负载。
EAP-TLS 密钥 application/x-pkcs12 对于 EAP-TLS 是必需的 以 base64 编码的 PKCS #12 ASN.1 结构,包含一个客户端证书链,其中至少具有客户端证书和关联私钥。PKCS 12 容器以及私钥和证书必须都是明文,没有密码。

“配置文件”部分必须以 base64 编码、UTF-8 编码的 XML 文本形式进行传输,这些文本会指定 Passpoint R2 技术规范版本 1.0.0 第 9.1 节中 HomeSPCredential 子树的部分。

顶级节点必须是 MgmtTree,而直接子节点必须是 PerProviderSubscription示例配置文件 OMA-DM XML 中显示了一个示例 XML 文件。

以下子树节点在 HomeSP 下使用:

  • FriendlyName:必须设置;用作显示文本
  • FQDN:必需
  • RoamingConsortiumOI

以下子树节点在 Credential 下使用:

  • Realm:必须为非空字符串
  • UsernamePassword:对于具有以下节点集的 EAP-TTLS 是必需的:

    • Username:包含用户名的字符串
    • Password:以 Base64 编码的字符串(在下例中,以 base64 编码的“password”字符串设置为 cGFzc3dvcmQ=
    • EAPMethod/EAPType:必须设置为 21
    • EAPMethod/InnerMethod:必须设置为 PAPCHAPMS-CHAPMS-CHAP-V2 中的一个
  • DigitalCertificate:对于 EAP-TLS 是必需的。必须设置以下节点:

    • CertificateType 设置为 x509v3
    • CertSHA256Fingerprint 设置为 EAP-TLS 密钥 MIME 部分中客户端证书的正确 SHA-256 摘要
  • SIM:对于 EAP-SIM、EAP-AKA 和 EAP-AKA' 是必需的。EAPType 字段必须设置为适当的 EAP 类型,而 IMSI 必须与进行配置时设备中已安装的 SIM 卡之一的 IMSI 相匹配。IMSI 字符串可以完全由十进制数字组成以强制执行完全对等匹配,也可以包含零个或更多个十进制数字,后跟星号 (*) 以将 IMSI 匹配要求放宽为仅匹配前缀。例如,IMSI 字符串 123* 将匹配 IMSI 以 123 开头的任何 SIM 卡。

示例配置文件 OMA-DM XML

<MgmtTree xmlns="syncml:dmddf1.2">
      <VerDTD>1.2</VerDTD>
      <Node>
        <NodeName>PerProviderSubscription</NodeName>
        <RTProperties>
          <Type>
            <DDFName>urn:wfa:mo:hotspot2dot0-perprovidersubscription:1.0</DDFName>
          </Type>
        </RTProperties>
        <Node>
          <NodeName>i001</NodeName>
          <Node>
            <NodeName>HomeSP</NodeName>
            <Node>
              <NodeName>FriendlyName</NodeName>
              <Value>Example Network</Value>
            </Node>
            <Node>
              <NodeName>FQDN</NodeName>
              <Value>hotspot.example.net</Value>
            </Node>
            <Node>
              <NodeName>RoamingConsortiumOI</NodeName>
              <Value>112233,445566</Value>
            </Node>
          </Node>
          <Node>
            <NodeName>Credential</NodeName>
            <Node>
              <NodeName>Realm</NodeName>
              <Value>example.com</Value>
            </Node>
            <Node>
              <NodeName>UsernamePassword</NodeName>
              <Node>
                <NodeName>Username</NodeName>
                <Value>user</Value>
              </Node>
              <Node>
                <NodeName>Password</NodeName>
                <Value>cGFzc3dvcmQ=</Value>
              </Node>
              <Node>
                <NodeName>EAPMethod</NodeName>
                <Node>
                  <NodeName>EAPType</NodeName>
                  <Value>21</Value>
                </Node>
                <Node>
                  <NodeName>InnerMethod</NodeName>
                  <Value>MS-CHAP-V2</Value>
                </Node>
              </Node>
            </Node>
          </Node>
        </Node>
      </Node>
    </MgmtTree>
    

身份验证建议

搭载 Android 8.x 或 Android 9 且装有 Passpoint R1 EAP-SIM、EAP-AKA 或 EAP-AKA' 配置文件的设备将无法自动连接到 Passpoint 网络。此问题会减少 Wi-Fi 分流,从而对用户、运营商和服务造成影响。

细分 影响 影响大小
运营商和 Passpoint 服务提供商 增加移动网络的负载。 使用 Passpoint R1 的任何运营商。
用户 错过了自动连接到运营商 Wi-Fi 接入点 (AP) 的机会,从而增加流量费用。 在支持 Passpoint R1 的运营商网络上运行设备的任何用户。

失败原因

Passpoint 会指定一种机制,将通告的 (ANQP) 服务提供商与设备上安装的配置文件进行匹配。以下针对 EAP-SIM、EAP-AKA 和 EAP-AKA' 的匹配规则是侧重于 EAP-SIM/AKA/AKA' 失败的部分规则:

If the FQDN (Fully Qualified Domain Name) matches
        then the service is a Home Service Provider.
    Else: If the PLMN ID (3GPP Network) matches
        then the service is a Roaming Service Provider.
    

第二个条件在 Android 8.0 中进行了修改:

Else: If the PLMN ID (3GPP Network) matches AND the NAI Realm matches
        then the service is a Roaming Service Provider.
    

修改后,系统检测不到任何与以前正常工作的服务提供商匹配的项目,因此 Passpoint 设备未自动连接。

解决方法

要解决修改后的匹配条件存在的问题,运营商和服务提供商需要将网络访问标识符 (NAI) Realm 添加到由 Passpoint AP 发布的信息中。

推荐的解决方案是让网络服务提供商实施网络端解决方法,这种方法部署速度最快。设备端解决方法依赖于原始设备制造商 (OEM) 从 AOSP 获取变更列表 (CL),然后更新在实际应用中的设备。

针对运营商和 Passpoint 服务提供商的网络修复

网络端解决方法需要重新配置网络以添加 NAI Realm ANQP 元素(如下文所述)。Passpoint 规范不需要 NAI Realm ANQP 元素,但添加此属性符合 Passpoint 规范,因此符合规范的客户端实现应该不会发生中断。

  1. 添加 NAI Realm ANQP 元素。
  2. 设置 NAI Realm 子字段以匹配设备上所安装配置文件的 Realm
  3. 根据每个 EAP 类型设置以下信息:

    • EAP-TTLS:设置 EAPMethod(21) 和支持的内部身份验证类型(PAPCHAPMS-CHAPMS-CHAP-V2
    • EAP-TLS:设置 EAPMethod(13)
    • EAP-SIM:设置 EAPMethod(18)
    • EAP-AKA:设置 EAPMethod(23)
    • EAP-AKA:设置 EAPMethod(50)
针对 OEM 的设备/AOSP 修复

要实施设备端解决方法,OEM 需要选择补丁程序 CL aosp/718508。此补丁程序可以在以下系统版本上应用(但不能应用于 Android 10 或更高版本):

  • Android 9
  • Android 8.x

挑选补丁程序后,OEM 需要更新在实际应用中的设备。

Passpoint R2

Android 10 提供了对 Passpoint R2 功能的支持。Passpoint R2 实现了在线注册 (OSU),这是一种配置新的 Passpoint 配置文件的标准方法。Android 10 支持使用 SOAP-XML 配置 EAP-TTLS 配置文件。

Android 10 中支持的 Passpoint R2 功能仅需要 AOSP 代码(无需额外的驱动程序或固件支持)。AOSP 代码还包括“设置”应用中 Passpoint R2 界面的默认实现。

当 Android 检测到 Passpoint R2 接入点时,Android 框架会:

  1. 在 Wi-Fi 选择器中显示服务提供商列表(除了显示 SSID 之外)。
  2. 提示用户点按其中一个服务提供商以设置 Passpoint 配置文件。
  3. 引导用户完成 Passpoint 配置文件设置流程。
  4. 成功完成后,安装生成的 Passpoint 配置文件。
  5. 使用新配置的 Passpoint 配置文件关联到 Passpoint 网络。