blob: 39fe879cc72419f4b403c0a2c9c45324aca99d45 [file] [log] [blame]
<html devsite><head>
<title>设备状态</title>
<meta name="project_path" value="/_project.yaml"/>
<meta name="book_path" value="/_book.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
//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.
-->
<p>
设备状态用于指明能够以多大的自由度将软件刷写到设备上,以及是否强制执行验证。设备状态为 <code>LOCKED</code><code>UNLOCKED</code>。状态为 <code>LOCKED</code> 的设备禁止您将新软件刷写到设备上,而状态为 <code>UNLOCKED</code> 的设备允许您进行修改。
</p>
<p>
当设备开机后,引导加载程序会先检查设备状态是 <code>LOCKED</code> 还是 <code>UNLOCKED</code>。如果设备状态为 <code>UNLOCKED</code>,引导加载程序会向用户显示警告,然后继续启动,即使加载的操作系统不是由信任根签名也是如此。
</p>
<p>
如果设备状态为 <code>LOCKED</code>,引导加载程序会完成<a href="/security/verifiedboot/verified-boot">验证启动</a>中的步骤,以验证该设备的软件。只有在加载的操作系统是由信任根正确签名时,状态为 <code>LOCKED</code> 的设备才会启动。<em></em>如需了解详情,请参阅<a href="/security/verifiedboot/boot-flow">启动流程</a>
</p>
<h2 id="changing-device-state">更改设备状态</h2>
<p>
<a href="/devices/bootloader/unlock-trusty">更改设备状态</a>,请使用 <code>fastboot flashing [unlock | lock]</code> 命令。为了保护用户数据,只要设备状态发生变化,都会先擦除数据分区中的数据,并会在删除数据之前要求用户确认。<em></em>
</p>
<p>
当用户购买二手开发设备后,应该将设备状态从 <code>UNLOCKED</code> 改为 <code>LOCKED</code>。锁定设备后,只要没有警告,用户应该就会确信设备处于设备制造商开发的状态。如果开发者希望出于开发目的停用设备上的验证功能,应该将设备状态从 <code>LOCKED</code> 改为 <code>UNLOCKED</code>
</p>
<h2 id="root-of-trust">信任根</h2>
<p>
<em></em>信任根是用于为设备上存储的 Android 副本签名的加密密钥。信任根的不公开部分只有设备制造商才知道,用于为旨在分发的每个 Android 版本签名。信任根的公开部分嵌入在设备中并存储在一个不会被篡改的位置(通常是只读存储区)。
</p>
<p>
加载 Android 时,引导加载程序会使用信任根来验证真实性。要详细了解此流程,请参阅<a href="/security/verifiedboot/verified-boot">验证启动</a>。设备可能具有多个引导加载程序,因此可能有多个加密密钥。
</p>
<h3 id="user-settable-root-of-trust">可由用户设置的信任根</h3>
<p>
设备可以根据需要选择允许用户配置信任根(例如,公钥)。设备可以使用此可由用户设置的信任根(而非内置的信任根)来验证启动。这样,用户就可以安装并使用自定义的 Android 版本,而不会牺牲验证启动的安全改进功能。
</p>
<p>
如果实现了可由用户设置的信任根,则应满足以下要求:
</p>
<ul>
<li>需要进行物理确认才能设置/清除可由用户设置的信任根。</li>
<li>可由用户设置的信任根只能由最终用户设置,而不能在出厂时或在最终用户获得设备之前的任意中间点设置。</li>
<li>可由用户设置的信任根存储在防篡改的存储空间中。
<em></em>“防篡改”是指可以检测到 Android 数据是否遭到篡改(例如,数据是否被覆盖或更改)。
</li>
<li>如果设置了可由用户设置的信任根,则设备应该允许启动使用内置信任根或可由用户设置的信任根签名的 Android 版本。</li>
<li>设备每次使用可由用户设置的信任根启动时,系统都应通知用户设备正在加载自定义的 Android 版本。要查看警告屏幕示例,请参阅<a href="/security/verifiedboot/boot-flow#locked-devices-with-custom-key-set">已设置自定义密钥的状态为 <code>LOCKED</code> 的设备</a></li>
</ul>
<p>
实现可由用户设置的信任根的一种方法是,将虚拟分区设置为仅当设备处于 <code>UNLOCKED</code> 状态时才能刷写或清除。Google Pixel 2 设备使用此方法以及名为 <code>avb_custom_key</code> 的虚拟分区。<code>avbtool extract_public_key</code> 命令会输出此分区中数据的格式。以下示例展示了如何设置可由用户设置的信任根:
</p>
<pre class="prettyprint"><code class="devsite-terminal">avbtool extract_public_key --key key.pem --output pkmd.bin</code>
<code class="devsite-terminal">fastboot flash avb_custom_key pkmd.bin</code>
</pre>
<p>
可由用户设置的信任根可通过发出以下命令来清除:
</p>
<pre class="devsite-terminal devsite-click-to-copy">fastboot erase avb_custom_key
</pre>
</body></html>