Passpoint R1
自从 Android 6.0 支持从网络下载包含配置文件和凭据信息的特殊文件来配置 Passpoint R1(第 1 版)凭据,Android 就一直支持 Passpoint R1。客户端会自动启动用于 WLAN 信息的特殊安装程序,并允许用户先查看各部分信息,然后再决定接受或拒绝内容。
文件中包含的配置文件信息用于与从已启用 Passpoint R1 的接入点检索到的数据进行匹配,并且系统会自动将凭据应用于任何匹配的网络。
Android 参考实现支持 EAP-TTLS、EAP-TLS、EAP-SIM、EAP-AKA 和 EAP-AKA'。
下载机制
wifi-config 文件必须托管在网络服务器上,而且应使用 TLS (HTTPS) 进行保护,因为其中可能包含明文密码或私钥数据。内容由经过封装的多部分 MIME 文本(以 UTF-8 表示)组成,并按照 RFC-2045 第 6.8 节所述以 base64 编码形式进行编码。
客户端使用以下 HTTP 标头字段在设备上自动启动 WLAN 安装程序:
-
Content-Type
必须设置为application/x-wifi-config
-
Content-Transfer-Encoding
必须设置为base64
- 不得设置
Content-Disposition
用于检索文件的 HTTP 方法必须为 GET。只要浏览器中的 HTTP GET 收到包含以上 MIME 标头的响应,系统就会启动安装应用。必须通过点按按钮(不支持指向下载网址的自动重定向)等 HTML 元素来触发下载。此行为仅适用于 Google Chrome;其他网络浏览器不一定会提供类似功能。
文件组成
以 base64 编码的内容必须由 Content-Type
为 multipart/mixed
的 MIME 多部分内容组成。以下部分构成了多部分内容的各个部分:
部分 | 内容类型(较少引用) | 是否必需 | 说明 |
配置文件 |
| 始终必需 | 采用 OMA-DM SyncML 格式的负载,包含用于 |
信任证书 |
| 可选(针对 EAP-TLS 和 EAP-TTLS) | 一个以 base64 编码的 X.509v3 证书负载。 |
EAP-TLS 密钥 |
| 必需(针对 EAP-TLS) | 以 base64 编码的 PKCS #12 ASN.1 结构,包含一个客户端证书链,其中至少具有客户端证书和关联私钥。PKCS 12 容器以及私钥和证书必须都是明文,没有密码。 |
“配置文件”部分必须以 base64 编码、UTF-8 编码的 XML 文本形式进行传输,这些文本会指定 Passpoint R2 技术规范版本 1.0.0 第 9.1 节中 HomeSP
和 Credential
子树的部分。
注意:Android 中用于 Passpoint R1 的配置文件 XML 格式借用了 Passpoint R2 格式,但不一定符合 R2 标准。这是一种设计上的选择,并非 Passpoint R1 的要求。
顶级节点必须是 MgmtTree
,而直接子节点必须是 PerProviderSubscription
。下面的附录中显示了一个示例 XML 文件。
以下子树节点在 HomeSP
下使用:
-
FriendlyName
:必须设置;用作显示文本 -
FQDN
:必需 RoamingConsortiumOI
以下子树节点在 Credential
下使用:
-
Realm
:必须为非空字符串 UsernamePassword
:对于具有以下节点集的 EAP-TTLS 是必需的:
Username
Password
-
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 字符串可以完全由十进制数字组成以强制执行完全对等匹配,也可以包含零个或更多个十进制数字,后跟星号 (*) 以将 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>Century House</Value>
</Node>
<Node>
<NodeName>FQDN</NodeName>
<Value>mi6.co.uk</Value>
</Node>
<Node>
<NodeName>RoamingConsortiumOI</NodeName>
<Value>112233,445566</Value>
</Node>
</Node>
<Node>
<NodeName>Credential</NodeName>
<Node>
<NodeName>Realm</NodeName>
<Value>shaken.stirred.com</Value>
</Node>
<Node>
<NodeName>UsernamePassword</NodeName>
<Node>
<NodeName>Username</NodeName>
<Value>james</Value>
</Node>
<Node>
<NodeName>Password</NodeName>
<Value>Ym9uZDAwNw==</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>