blob: 4790d789d806ad365d53f64f43f05c9f6917c8f6 [file] [log] [blame]
<html devsite><head>
<meta name="book_path" value="/_book.yaml"/>
<meta name="project_path" value="/_project.yaml"/>
</head>
<body>
<!--
Copyright 2018 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<h1 id="passpoint_r1" class="page-title">Passpoint R1</h1>
<p>自从 Android 6.0 支持从网络下载包含配置文件和凭据信息的特殊文件来配置 Passpoint R1(第 1 版)凭据,Android 就一直支持 Passpoint R1。客户端会自动启动用于 WLAN 信息的特殊安装程序,并允许用户先查看各部分信息,然后再决定接受或拒绝内容。</p>
<p>文件中包含的配置文件信息用于与从已启用 Passpoint R1 的接入点检索到的数据进行匹配,并且系统会自动将凭据应用于任何匹配的网络。</p>
<p>Android 参考实现支持 EAP-TTLS、EAP-TLS、EAP-SIM、EAP-AKA 和 EAP-AKA'。</p>
<h2 id="download_mechanism">下载机制</h2>
<p>wifi-config 文件必须托管在网络服务器上,而且应使用 TLS (HTTPS) 进行保护,因为其中可能包含明文密码或私钥数据。内容由经过封装的多部分 MIME 文本(以 UTF-8 表示)组成,并按照 RFC-2045 第 6.8 节所述以 base64 编码形式进行编码。</p>
<p>客户端使用以下 HTTP 标头字段在设备上自动启动 WLAN 安装程序:</p>
<ul>
<li><code>Content-Type</code> 必须设置为 <code>application/x-wifi-config</code></li>
<li><code>Content-Transfer-Encoding</code> 必须设置为 <code>base64</code></li>
<li>不得设置 <code>Content-Disposition</code></li>
</ul>
<p>用于检索文件的 HTTP 方法必须为 GET。只要浏览器中的 HTTP GET 收到包含以上 MIME 标头的响应,系统就会启动安装应用。必须通过点按按钮(不支持指向下载网址的自动重定向)等 HTML 元素来触发下载。此行为仅适用于 Google Chrome;其他网络浏览器不一定会提供类似功能。</p>
<h2 id="file_composition">文件组成</h2>
<p>以 base64 编码的内容必须由 <code>Content-Type</code><code>multipart/mixed</code> 的 MIME 多部分内容组成。以下部分构成了多部分内容的各个部分:</p>
<table>
<thead>
<tr>
<th><strong>部分</strong></th>
<th><strong>内容类型(较少引用)</strong></th>
<th><strong>是否必需</strong></th>
<th><strong>说明</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>配置文件</td>
<td><code>
application/x-passpoint-profile
</code>
</td>
<td>始终必需</td>
<td>采用 OMA-DM SyncML 格式的负载,包含用于 <code>HomeSP</code><code>Credential</code> 且采用 Passpoint R1 <code>PerProviderSubscription</code> 格式的 MO。</td>
</tr>
<tr>
<td>信任证书</td>
<td><code>
application/x-x509-ca-cert
</code>
</td>
<td>可选(针对 EAP-TLS 和 EAP-TTLS)</td>
<td>一个以 base64 编码的 X.509v3 证书负载。</td>
</tr>
<tr>
<td>EAP-TLS 密钥</td>
<td><code>
application/x-pkcs12
</code>
</td>
<td>必需(针对 EAP-TLS)</td>
<td>以 base64 编码的 PKCS #12 ASN.1 结构,包含一个客户端证书链,其中至少具有客户端证书和关联私钥。PKCS 12 容器以及私钥和证书必须都是明文,没有密码。</td>
</tr>
</tbody>
</table>
<p>“配置文件”部分必须以 base64 编码、UTF-8 编码的 XML 文本形式进行传输,这些文本会指定 Passpoint R2 技术规范版本 1.0.0 第 9.1 节中 <code>HomeSP</code><code>Credential</code> 子树的部分。</p>
<aside class="note"><strong>注意</strong><span>Android 中用于 Passpoint R1 的配置文件 XML 格式借用了 Passpoint R2 格式,但不一定符合 R2 标准。这是一种设计上的选择,并非 Passpoint R1 的要求。</span></aside>
<p>顶级节点必须是 <code>MgmtTree</code>,而直接子节点必须是 <code>PerProviderSubscription</code>。下面的附录中显示了一个示例 XML 文件。</p>
<p>以下子树节点在 <code>HomeSP</code> 下使用:</p>
<ul>
<li><code>FriendlyName</code>:必须设置;用作显示文本</li>
<li><code>FQDN</code>:必需</li>
<li><code>RoamingConsortiumOI</code></li>
</ul>
<p>以下子树节点在 <code>Credential</code> 下使用:</p>
<ul>
<li><code>Realm</code>:必须为非空字符串</li>
<li><p><code>UsernamePassword</code>:对于具有以下节点集的 EAP-TTLS 是必需的:</p>
<ul>
<li><code>Username</code></li>
<li><code>Password</code></li>
<li><code>EAPMethod/EAPType</code>:必须设置为 <code>21</code></li>
<li><code>EAPMethod/InnerMethod</code>:必须设置为 <code>PAP</code><code>CHAP</code><code>MS-CHAP</code><code>MS-CHAP-V2</code> 中的一个</li>
</ul></li>
<li><p><code>DigitalCertificate</code>:对于 EAP-TLS 是必需的。必须设置以下节点:</p>
<ul>
<li><code>CertificateType</code> 设置为 <code>x509v3</code></li>
<li><code>CertSHA256Fingerprint</code> 设置为 EAP-TLS 密钥 MIME 部分中客户端证书的正确 SHA-256 摘要。</li>
</ul></li>
<li><p><code>SIM</code>:对于 EAP-SIM、EAP-AKA 和 EAP-AKA' 是必需的。<code>EAPType</code> 字段必须设置为适当的 EAP 类型,而 <code>IMSI</code> 必须与进行配置时设备中已安装的 SIM 卡之一的 IMSI 相匹配。IMSI 字符串可以完全由十进制数字组成以强制执行完全对等匹配,也可以包含零个或更多个十进制数字,后跟星号 (*) 以将 IMSI 匹配要求放宽为仅匹配前缀。例如,IMSI 字符串 123* 将匹配 IMSI 以 123 开头的任何 SIM 卡。</p></li>
</ul>
<h2 id="example_profile_oma-dm_xml">示例配置文件 OMA-DM XML</h2>
<pre class="prettyprint lang-xml"><code>&lt;MgmtTree xmlns="syncml:dmddf1.2"&gt;
&lt;VerDTD&gt;1.2&lt;/VerDTD&gt;
&lt;Node&gt;
&lt;NodeName&gt;PerProviderSubscription&lt;/NodeName&gt;
&lt;RTProperties&gt;
&lt;Type&gt;
&lt;DDFName&gt;urn:wfa:mo:hotspot2dot0-perprovidersubscription:1.0&lt;/DDFName&gt;
&lt;/Type&gt;
&lt;/RTProperties&gt;
&lt;Node&gt;
&lt;NodeName&gt;i001&lt;/NodeName&gt;
&lt;Node&gt;
&lt;NodeName&gt;HomeSP&lt;/NodeName&gt;
&lt;Node&gt;
&lt;NodeName&gt;FriendlyName&lt;/NodeName&gt;
&lt;Value&gt;Century House&lt;/Value&gt;
&lt;/Node&gt;
&lt;Node&gt;
&lt;NodeName&gt;FQDN&lt;/NodeName&gt;
&lt;Value&gt;mi6.co.uk&lt;/Value&gt;
&lt;/Node&gt;
&lt;Node&gt;
&lt;NodeName&gt;RoamingConsortiumOI&lt;/NodeName&gt;
&lt;Value&gt;112233,445566&lt;/Value&gt;
&lt;/Node&gt;
&lt;/Node&gt;
&lt;Node&gt;
&lt;NodeName&gt;Credential&lt;/NodeName&gt;
&lt;Node&gt;
&lt;NodeName&gt;Realm&lt;/NodeName&gt;
&lt;Value&gt;shaken.stirred.com&lt;/Value&gt;
&lt;/Node&gt;
&lt;Node&gt;
&lt;NodeName&gt;UsernamePassword&lt;/NodeName&gt;
&lt;Node&gt;
&lt;NodeName&gt;Username&lt;/NodeName&gt;
&lt;Value&gt;james&lt;/Value&gt;
&lt;/Node&gt;
&lt;Node&gt;
&lt;NodeName&gt;Password&lt;/NodeName&gt;
&lt;Value&gt;Ym9uZDAwNw==&lt;/Value&gt;
&lt;/Node&gt;
&lt;Node&gt;
&lt;NodeName&gt;EAPMethod&lt;/NodeName&gt;
&lt;Node&gt;
&lt;NodeName&gt;EAPType&lt;/NodeName&gt;
&lt;Value&gt;21&lt;/Value&gt;
&lt;/Node&gt;
&lt;Node&gt;
&lt;NodeName&gt;InnerMethod&lt;/NodeName&gt;
&lt;Value&gt;MS-CHAP-V2&lt;/Value&gt;
&lt;/Node&gt;
&lt;/Node&gt;
&lt;/Node&gt;
&lt;/Node&gt;
&lt;/Node&gt;
&lt;/Node&gt;
&lt;/MgmtTree&gt;
</code></pre>
<h2 id="auth_advisory">身份验证建议</h2>
<p>搭载 Android 8.0 或更高版本且装有 Passpoint R1 EAP-SIM、EAP-AKA 或 EAP-AKA 配置文件的设备将无法自动连接到 Passpoint 网络。此问题会减少 WLAN 分流,从而对用户、运营商和服务造成影响。</p>
<table>
<tbody><tr>
<th><strong>细分</strong>
</th>
<th><strong>影响</strong>
</th>
<th><strong>影响大小</strong>
</th>
</tr>
<tr>
<td>运营商和 Passpoint 服务提供商
</td>
<td>增加移动网络的负载。
</td>
<td>使用 Passpoint R1 的任何运营商。
</td>
</tr>
<tr>
<td>用户
</td>
<td>错过了自动连接到运营商 WLAN 接入点 (AP) 的机会,从而增加流量费用。
</td>
<td>在支持 Passpoint R1 的运营商网络上运行设备的任何用户。
</td>
</tr>
</tbody></table>
<h3 id="cause_of_failure">失败原因</h3>
<p>Passpoint 会指定一种机制,将广告 (ANQP) 服务提供商与设备上安装的配置文件进行匹配。以下针对 EAP-SIM、EAP-AKA 和 EAP-AKA 的匹配规则是侧重于 EAP-SIM/AKA/AKA 失败的部分规则:</p>
<pre class="prettyprint"><code>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.
</code></pre>
<p>第二个条件在 Android 8.0 中进行了修改:</p>
<pre class="prettyprint"><code>Else: If the PLMN ID (3GPP Network) matches AND the NAI Realm matches
then the service is a Roaming Service Provider.
</code></pre>
<p>此修改后的条件意味着系统检测不到任何与以前正常工作的服务提供商匹配的项目,因此 Passpoint 设备未自动连接。</p>
<h3 id="workarounds">解决方法</h3>
<p>要解决修改后的匹配条件存在的问题,运营商和服务提供商需要将 <code>NAI Realm</code> 添加到由 Passpoint AP 发布的信息中。</p>
<p>推荐的解决方案是让网络服务提供商实施网络端解决方法,这种方法部署速度最快。设备端解决方法依赖于原始设备制造商 (OEM) 从 Android 开源项目 (AOSP) 获取变更列表 (CL),然后更新在实际应用中的设备。</p>
<h4 id="network_fix_for_carriers_and_passpoint_service_providers">针对运营商和 Passpoint 服务提供商的网络修复</h4>
<p>网络端解决方法需要重新配置网络以添加 <code>NAI
Realm</code> ANQP 元素(如下文所述)。Passpoint 规范不需要 <code>NAI Realm</code> ANQP 元素,但添加此属性符合 Passpoint 规范,因此符合规范的客户端实现应该不会发生中断。</p>
<ol>
<li>添加 <code>NAI Realm</code> ANQP 元素。</li>
<li>设置 <code>NAI Realm</code> 子字段以匹配设备上安装所配置文件的 <code>Realm</code></li>
</ol>
<h4 id="deviceaosp_fix_for_oems">针对原始设备制造商 (OEM) 的设备/AOSP 修复</h4>
<p>要实现设备端解决方法,原始设备制造商 (OEM) 需要选择补丁程序 CL <a href="https://android-review.googlesource.com/c/platform/frameworks/opt/net/wifi/+/718508">aosp/718508</a>。此补丁程序可以在以下系统版本上应用:</p>
<ul>
<li>Android 8.x</li>
<li>Android 9</li>
</ul>
<p>挑选补丁程序后,原始设备制造商 (OEM) 需要更新在实际应用中的设备。</p>
</body></html>