Passpoint 是一种 Wi-Fi 联盟 (WFA) 协议,让移动设备能够发现并验证提供互联网接入的无线网络热点。
设备支持
为了支持 Passpoint,设备制造商需要实现 Supplicant 接口。从 Android 13 开始,该接口使用 AIDL 进行 HAL 定义。对于 Android 13 之前的版本,接口和供应商分区使用 HIDL。HIDL 文件位于 hardware/interfaces/supplicant/1.x
中,AIDL 文件位于 hardware/interfaces/supplicant/aidl
中。Supplicant 提供对 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 功能的实现,请运行以下 Passpoint 软件包单元测试
服务测试
atest com.android.server.wifi.hotspot2
管理器测试
atest android.net.wifi.hotspot2
Passpoint R1 配置
自 Android 6.0 起,Android 就已支持 Passpoint R1,允许通过基于 Web 的特殊文件下载来配置 Passpoint R1(版本 1)凭据,该文件包含配置文件和凭据信息。客户端会自动启动 Wi-Fi 信息的特殊安装程序,并允许用户在接受或拒绝内容之前查看部分信息。
文件中包含的配置文件信息用于与从启用 Passpoint 的接入点检索的数据进行匹配,凭据会自动应用于任何匹配的网络。
Android 参考实现支持 EAP-TTLS、EAP-TLS、EAP-SIM、EAP-AKA 和 EAP-AKA'。
下载机制
Passpoint 配置文件必须托管在 Web 服务器上,并且应使用 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;其他 Web 浏览器可能提供或不提供类似的功能。
文件组成
Base64 编码的内容必须由 MIME 多部分内容组成,其 Content-Type
为 multipart/mixed
。以下部分构成多部分内容的各个部分。
部分 | Content-Type(不带引号) | 必需 | 说明 |
---|---|---|---|
配置文件 | application/x-passpoint-profile
|
始终 | OMA-DM SyncML 格式的有效负载,其中包含用于 HomeSP 和 Credential 的 Passpoint R1 PerProviderSubscription 格式的 MO。 |
信任证书 | application/x-x509-ca-cert
|
EAP-TLS 和 EAP-TTLS 必需 | 单个 X.509v3 base64 编码的证书有效负载。 |
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 节中 HomeSP
和 Credential
子树的部分内容。
顶级节点必须是 MgmtTree
,直接子节点必须是 PerProviderSubscription
。示例 XML 文件请参见示例配置文件 OMA-DM XML。
以下子树节点在 HomeSP
下使用
FriendlyName
:必须设置;用作显示文本FQDN
:必需RoamingConsortiumOI
以下子树节点在 Credential
下使用
Realm
:必须是非空字符串UsernamePassword
:EAP-TTLS 必需,需要设置以下节点Username
:包含用户名的字符串Password
:Base64 编码的字符串(在下面的示例中设置为cGFzc3dvcmQ=
,即“password”的 base64 编码字符串)EAPMethod/EAPType
:必须设置为21
EAPMethod/InnerMethod
:必须设置为PAP
、CHAP
、MS-CHAP
或MS-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 字符串可以完全由十进制数字组成以强制完全相等匹配,也可以由 5 个或 6 个十进制数字后跟星号 (*) 组成,以将 IMSI 匹配放宽到仅 MCC/MNC。例如,IMSI 字符串 123456* 匹配 MCC 为 123 且 MNC 为 456 的任何 SIM 卡。
Android 11 引入了使 Passpoint R1 配置更加灵活的功能。
- 单独的身份验证、授权和计费 (AAA) 域名
需要独立于通过接入网络查询协议 (ANQP) 由网络播发的完全限定域名 (FQDN) 指定 AAA 域名的 Passpoint 网络管理员可以在
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 及更高版本支持使用基于开放 OSU ESS 的 SOAP-XML 协议来配置 EAP-TTLS 配置文件。
支持的 Passpoint R2 功能仅需要 AOSP 参考代码(不需要额外的驱动程序或固件支持)。AOSP 参考代码还包括 Settings 应用中 Passpoint R2 UI 的默认实现。
当 Android 检测到 Passpoint R2 接入点时,Android 框架会执行以下操作
- 在 Wi-Fi 选择器中显示 AP 播发的服务提供商列表(除了显示 SSID 之外)。
- 提示用户点按其中一个服务提供商以设置 Passpoint 配置文件。
- 引导用户完成 Passpoint 配置文件设置流程。
- 成功完成后安装生成的 Passpoint 配置文件。
- 使用新配置的 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 根据 WBA PPS-MO 扩展规范实现了此功能。
- 即将到来的取消身份验证处理
- 允许网络运营商向设备发出信号,表明用于对网络进行身份验证的凭据在一定时长内(通过超时延迟指定)不可用。收到此信号后,设备在超时延迟到期之前不会尝试使用相同的凭据重新连接到网络。相比之下,不支持此功能的设备可能会在服务不可用时尝试重复重新连接到网络。
OMA-DM PerProviderSubscription-MO XML 配置文件示例
具有用户名/密码凭据的配置文件 (EAP-TTLS)
以下示例演示了网络的配置文件,该网络具有
- 网络友好名称设置为
Example Network
- FQDN 设置为
hotspot.example.net
- 漫游联盟 OI(用于漫游)
- 凭据,用户名
user
,密码password
使用 Base64 编码,领域设置为example.net
- EAP 方法设置为
21
(EAP-TTLS) - Phase-2 内部方法设置为
MS-CHAP-V2
- 备用 AAA 域名设置为
trusted.com
和trusted.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(用于漫游)
- 领域设置为
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
- SIM 凭据,PLMN ID 为
999888
- 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 设备未自动连接。
解决方法
为了解决修改后的匹配标准问题,运营商和服务提供商需要在 Passpoint AP 发布的信息中添加网络接入标识符 (NAI) 领域。
建议的解决方案是网络服务提供商实施网络端解决方法,以实现最快的部署时间。设备端解决方法取决于 OEM 从 AOSP 中提取变更列表 (CL),然后在现场更新设备。
运营商和 Passpoint 服务提供商的网络修复
网络端解决方法需要重新配置网络以添加 NAI 领域 ANQP 元素,如下所示。Passpoint 规范不要求 NAI 领域 ANQP 元素,但添加此属性符合 Passpoint 规范,因此符合规范的客户端实现不应中断。
- 添加 NAI 领域 ANQP 元素。
- 设置 NAI 领域子字段以匹配设备上安装的配置文件的
Realm
。 根据每个 EAP 类型设置以下信息
- EAP-TTLS:设置
EAPMethod(21)
和支持的内部身份验证类型(PAP
、CHAP
、MS-CHAP
或MS-CHAP-V2
) - EAP-TLS:设置
EAPMethod(13)
- EAP-SIM:设置
EAPMethod(18)
- EAP-AKA:设置
EAPMethod(23)
- EAP-AKA':设置
EAPMethod(50)
- EAP-TTLS:设置
OEM 的设备/AOSP 修复
为了实施设备端解决方法,OEM 需要提取补丁 CL aosp/718508。此补丁可以应用于以下版本之上(不适用于 Android 10 或更高版本)
- Android 9
- Android 8.x
提取补丁后,OEM 需要更新现场设备。