Passpoint(热点 2.0)

Passpoint 是一种 Wi-Fi 联盟 (WFA) 协议,可让移动设备发现提供互联网访问权限的 Wi-Fi 热点并完成身份验证。

设备支持

如需支持 Passpoint,设备制造商需要实现客户端接口。从 Android 13 开始,该接口使用 AIDL 进行 HAL 定义。对于 Android 13 之前的版本,接口和供应商分区使用 HIDL。HIDL 文件位于 hardware/interfaces/supplicant/1.x 中,AIDL 文件位于 hardware/interfaces/supplicant/aidl 中。请求方支持 802.11u 标准,特别是网络发现和选择功能,例如通用通告服务 (GAS) 和接入网络查询协议 (ANQP)。

实现

Android 11 或更高版本

若要在搭载 Android 11 或更高版本的设备上支持 Passpoint,设备制造商需要提供对 802.11u 的固件支持。支持 Passpoint 的所有其他要求都包含在 AOSP 中。

Android 10 或更低版本

对于搭载 Android 10 或更低版本的设备,设备制造商需要同时提供框架和 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 软件包单元测试。

服务测试:

atest com.android.server.wifi.hotspot2

Manager 测试:

atest android.net.wifi.hotspot2

集成测试 (ACTS)

ACTS Passpoint 测试套件(位于 tools/test/connectivity/acts_tests/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 卡。

Android 11 引入了一些功能,旨在使 Passpoint R1 配置更加灵活。

单独的身份验证、授权和记帐 (AAA) 域名

如果 Passpoint 网络管理员需要指定 AAA 域名,并且该域名独立于网络通过接入网络查询协议 (ANQP) 通告的完全限定域名 (FQDN),那么该管理员可以在 Extension 子树下的新节点中指定以英文分号分隔的 FQDN 列表。这是一个可选节点,搭载 Android 10 或更低版本的设备会忽略此节点。

  • Android:Android 扩展子树

    • AAAServerTrustedNames:对于具有以下节点集的 AAA 服务器可信名称是必需的:

      • FQDN:包含 AAA 服务器可信名称的字符串。使用英文分号分隔可信名称。例如 example.org;example.com
自签名的私人根 CA
在内部管理证书的 Passpoint 网络管理员可以配置采用私人自签名 CA 进行 AAA 身份验证的配置文件。
允许安装没有根 CA 证书的配置文件
附加到配置文件的根 CA 证书用于 AAA 服务器身份验证。想依靠受信任的公共根 CA 进行 AAA 服务器身份验证的 Passpoint 网络管理员可以配置没有根 CA 证书的配置文件。在这种情况下,系统会根据安装在信任库中的公共根 CA 证书验证 AAA 服务器证书。

Passpoint R2 配置

Android 10 引入了对 Passpoint R2 功能的支持。Passpoint R2 实现了在线注册 (OSU),这是一种配置新的 Passpoint 配置文件的标准方法。Android 10 及更高版本支持使用 SOAP-XML 协议通过开放 OSU ESS 配置 EAP-TTLS 配置文件。

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

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

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

Passpoint R3 功能

Android 12 引入了以下 Passpoint R3 功能,这些功能可改善用户体验,并让网络遵守当地法律:

条款及条件

法律规定,在某些位置和场地,必须接受条款及条件,才能提供网络访问权限。此功能使网络部署能够将不安全的强制门户(使用开放网络)替换为安全的 Passpoint 网络。当要求用户接受条款及条件时,系统会向用户显示一条通知。

条款及条件对应的网址必须指向使用 HTTPS 技术的安全网站。如果该网址指向不安全的网站,框架会立即断开网络连接并阻止网络访问。

场地信息网址

允许网络运营商和场地向用户提供其他信息,例如场地地图、名录、促销活动和优惠券。当连接到网络时,系统会向用户显示一条通知。

场地信息对应的网址必须指向使用 HTTPS 技术的安全网站。如果该网址指向不安全的网站,框架会忽略该网址,并且不会显示通知。

其他 Passpoint 功能

Android 11 引入了以下 Passpoint 功能,用于提升用户体验、减少耗电量和提高部署灵活性。

失效日期强制执行和通知
对配置文件强制执行失效日期可让框架避免使用过期凭据自动连接到接入点,该操作必定会失败。这样可以阻止无线连接,并节省电量和后端带宽。当与用户的配置文件匹配的网络位于范围内但该配置文件已过期时,框架会向用户显示通知。
具有相同 FQDN 的多个配置文件
部署 Passpoint 网络并使用多个公共陆地移动网络 (PLMN) ID 的运营商可以配置具有相同 FQDN 的多个 Passpoint 配置文件(每个 PLMN ID 对应一个),该配置文件会自动与已安装的 SIM 卡匹配并用于连接到网络。

Android 12 引入了以下 Passpoint 功能,用于提升用户体验、减少耗电量和提高部署灵活性。

修饰的身份前缀
对带有前缀修饰的网络进行身份验证时,修饰的身份前缀允许网络运营商更新网络访问标识符 (NAI),以通过 AAA 网络内的多个代理执行显式路由(请参阅 RFC 7542)。 Android 12 实现了此功能,以符合 PPS-MO 扩展的 WBA 规范
解除身份验证即将处理
允许网络运营商向设备发出信号,指明服务不可用,以便使用的凭据在一定时间(通过超时延迟指定)内向网络进行身份验证。收到此信号后,设备在超时延迟时间过后,才会尝试使用同一凭据重新连接到网络。相反,不支持此功能的设备可能会在服务不可用期间重复尝试重新连接到网络。

OMA-DM PerProviderSubscription-MO XML 配置文件示例

具有用户名/密码凭据 (EAP-TTLS) 的配置文件

以下示例演示了具有以下特征的网络的配置文件:

  • 好记的网络名称设为 Example Network
  • FQDN 设为 hotspot.example.net
  • 漫游联盟 OI(针对漫游)
  • 用户名为 user、密码为 password(使用 Base64 编码)且 Realm 设为 example.net 的凭据
  • EAP 方法设置为 21 (EAP-TTLS)
  • 第 2 阶段内部方法设为 MS-CHAP-V2
  • 备用 AAA 域名设为 trusted.comtrusted.net
<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.net</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>
        <NodeName>Extension</NodeName>
        <Node>
            <NodeName>Android</NodeName>
            <Node>
                <NodeName>AAAServerTrustedNames</NodeName>
                <Node>
                    <NodeName>FQDN</NodeName>
                    <Value>trusted.com;trusted.net</Value>
                </Node>
            </Node>
        </Node>
      </Node>
    </Node>
  </Node>
</MgmtTree>

具有数字证书凭据 (EAP-TLS) 的配置文件

以下示例演示了具有以下特征的网络的配置文件:

  • 好记的网络名称设为 GlobalRoaming
  • FQDN 设为 globalroaming.net
  • 漫游联盟 OI(针对漫游)
  • Realm 设为 users.globalroaming.net
  • 具有包含指定指纹的数字证书的凭据
<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>GlobalRoaming</Value>
        </Node>
        <Node>
          <NodeName>FQDN</NodeName>
          <Value>globalroaming.net</Value>
        </Node>
        <Node>
          <NodeName>RoamingConsortiumOI</NodeName>
          <Value>FFEEDDCC0,FFEEDDCC1,009999,008888</Value>
        </Node>
      </Node>
      <Node>
        <NodeName>Credential</NodeName>
        <Node>
          <NodeName>Realm</NodeName>
          <Value>users.globalroaming.net</Value>
        </Node>
        <Node>
          <NodeName>DigitalCertificate</NodeName>
          <Node>
            <NodeName>CertificateType</NodeName>
            <Value>x509v3</Value>
          </Node>
          <Node>
            <NodeName>CertSHA256Fingerprint</NodeName>
            <Value>0ef08a3d2118700474ca51fa25dc5e6d3d63d779aaad8238b608a853761da533</Value>
          </Node>
        </Node>
      </Node>
    </Node>
  </Node>
</MgmtTree>

具有 SIM 凭据 (EAP-AKA) 的配置文件

以下示例演示了具有以下特征的网络的配置文件:

  • 好记的网络名称设为 Purple Passpoint
  • FQDN 设为 wlan.mnc888.mcc999.3gppnetwork.org
  • PLMN ID 为 999888 的 SIM 卡凭据
  • EAP 方法设置为 23 (EAP-AKA)
<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>Purple Passpoint</Value>
        </Node>
        <Node>
          <NodeName>FQDN</NodeName>
          <Value>purplewifi.com</Value>
        </Node>
      </Node>
      <Node>
        <NodeName>Credential</NodeName>
        <Node>
          <NodeName>Realm</NodeName>
          <Value>wlan.mnc888.mcc999.3gppnetwork.org</Value>
        </Node>
        <Node>
          <NodeName>SIM</NodeName>
          <Node>
            <NodeName>IMSI</NodeName>
            <Value>999888*</Value>
          </Node>
          <Node>
            <NodeName>EAPType</NodeName>
            <Value>23</Value>
          </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) 从 Android 开源项目 (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 需要更新实际使用中的设备。