silabs 21Q2 安全 BLE 设备安全实验室
BLE 安全实验室手册
在本实验中,您将了解如何设计更安全的 BLE 设备。 我们将从结束开始view 关于如何使用一些堆栈功能并继续讨论有关更安全连接的技术的一般建议,最后我们将看到如何使用设备证书而不是 BLE 来识别外围设备的真实性。
入门
蓝牙amp您将在其上构建的文件旨在与引导加载程序一起使用。 如果您使用全新的 EFR32MG21B,它将没有引导加载程序。 您可以在 platform\bootloader\s 中找到预构建的引导加载程序ampSDK 的 le-apps\bootloader-storage-internalsingle\efr32mg21a010f1024im32-brd4181a 文件夹。
- 从一个 soc-empty s 开始amp乐应用程序。 这是ample app 用作模板,是任何 BLE 应用程序的良好起点。
- 从 Simplicity Studio 打开 Silicon Labs 项目向导 File 菜单-> 新的。
- 选择 BRD4181C 并单击“下一步”按钮。
- 单击技术类型下的“蓝牙 (9)”复选框。
- 突出显示“蓝牙 – SoC 空”,然后单击下一步。
- 单击“完成”按钮。
- 现在您可以添加一些特征来查看受保护和不受保护的特征如何被区别对待。
- 打开项目的slcp file 通过在 Project Explorer 窗口中双击它
- 突出显示“软件组件”选项卡并打开 GATT 配置工具,如下所示:
并使用如下所示的导入工具导入 gatt_configuration.btconf file 从提供的材料中的服务器文件夹中。
GATT 数据库有一个自定义服务,称为“培训”,其中一些数据受到保护,而另一些则不受保护。 这使您可以比较尝试访问受保护特征与未受保护特征时发生的情况。 这是制造具有非常基本安全性的设备的快速方法。
- 我们将使用串行端口打印到 Simplicity Studio 中的控制台,以跟踪应用程序中发生的情况。 查找这些组件的最简单方法是在 SOFTWARE COMPONENTS 对话框中搜索它们,如下所示:
-
- 安装 IO 流 USART 组件
- 安装 IO Stream Retarget STDIO 组件
- 安装标准 I/O 组件
- 安装日志组件
- 打开 Board Control 组件并打开“Enable Virtual COM UART”
- 右键单击“调试适配器”面板中的适配器,然后选择“启动控制台”。 选择“Serial 1”选项卡并将光标放在控制台窗口的文本输入字段中,然后按 Enter 键唤醒控制台。
-
- 在 app.c 中的 sl_bt_on_event() 中创建一个局部变量,用于保存连接句柄。 该变量必须是静态的,因为每次堆栈引发事件时都会调用此函数,并且我们希望该值是持久的。 连接句柄将在稍后使用
实验室的部分。 - 为事件插入一些 app_log() 语句以查看我们何时连接、安全模式等
-
- 包括 app_log.h 标头 file

- sl_bt_evt_connection_opened – 打印绑定句柄并保存连接句柄。 如果绑定句柄为 0xFF,则连接的设备之间不存在绑定。 修改现有的事件处理程序,使其看起来像这样:

- sl_bt_evt_connection_parameters – 安全模式。 这样做是为了让您可以看到安全模式何时更改。 安全模式的编号有所不同,其中安全模式 1 被枚举为值 0 等。 将以下事件处理程序添加到您的应用程序:

- sl_bt_evt_connection_closed_id。 修改此事件处理程序以更新连接句柄。 值 0xFF 用于指示没有活动连接。 app_log() 命令用于打印连接被关闭的原因,状态码列表在这里。 修改现有的事件处理程序,使其看起来像这样:

- 包括 app_log.h 标头 file
-
- 构建并刷新项目。 此时,我们将运行 samp除了 GATT 数据库之外,该应用程序可以在没有任何更改的情况下查看它的行为方式。
- 使用 EFRConnect 移动应用程序连接如下:
-
- 点击“蓝牙浏览器”图标。
- 点击名为“训练”的设备上的“连接”图标。
-
- 读取未受保护的特征如下:
-
- 点击 UUID a815944e-da1e-9d2a-02e2-a8d15e2430a0 的未知服务下的“更多信息”链接。
- 通过点击“读取”图标读取未受保护的特征 UUID f9e91a44-ca91-4aba-1c33-fd43ca270b4c。 这里没有惊喜。 由于该特征不受任何保护,因此将以明文形式发送。
-
- 现在读取受保护的特征,UUID d4261dbb-dcd0-daab-ec95-deec088d532b。 您的手机应该会提示您配对和连接,消息可能会因您的移动操作系统而异。 接受配对请求后,您应该在控制台上显示如下消息:
笔记:本手册末尾的附录 A 总结了 I/O 功能和配对方法,以供参考。 附录 B 总结了蓝牙安全模式。
安全管理器配置
安全管理器是确定使用哪些安全功能的蓝牙堆栈的一部分。 这些功能包括中间人 (MITM) 保护、LE 安全连接 (又名 ECDH)、需要确认绑定等。安全管理器还处理用于确定用于配对的方法的 I/O 功能/bonding(参见附录 A 的摘要)。 在本节中,您将看到一个简单的设置。
- 使用所需的配置设置 SM。 该实验室的硬件可以轻松地在控制台上显示密码。 密码输入是启用 MITM 保护的要求。 将以下代码添加到您的 sl_bt_system_boot_id 事件处理程序。 这启用了中间人并通知远程设备我们有能力显示密码,但仅此而已。

- 要在控制台上显示密钥,需要一个事件处理程序,如下所示:

- 设置绑定模式、最大绑定数等。使用以下代码开始:
这些设置可用于限制攻击者与您的设备绑定的能力。 如果您的产品只需要一个用户,那么您可以将最大绑定限制为 1。添加这些调用的一个好地方是在 sl_bt_system_boot_id 事件处理程序中。 我们目前不会启用绑定以使实验室的其余部分进行得更顺利,但我们确实设置了一个绑定策略,只允许一个绑定。 作为参考,可在此处和此处找到这些 API 的文档。 - 为 sl_bt_evt_sm_bonded_id 和 sl_bt_evt_sm_bonding_failed_id 添加事件处理程序。 这些事件的主要用途目前是提供信息,但稍后在实验室中您将添加功能。

- 构建并刷写到目标板。 与 EFRConnect 连接并像以前一样读取受保护的特征。 这一次,您将在控制台上看到一个密码。 出现提示时,在您的手机上输入此密钥。
- 尝试绑定确认。 此功能使用户能够要求确认绑定请求。 这样做可以让应用程序控制它与哪些对等设备绑定。 一种可能性是要求用户在允许绑定之前按下按钮。
- 打开手机中的蓝牙设置,解除与 EFR32 设备的绑定。 移动电话实施方式各不相同,因此此步骤可能不是必需的。 如果您在蓝牙设置中没有看到“训练”设备,请继续下一步。
- 在软件组件中,安装简单按钮处理程序的一个实例。
- 包括标题 file app.c 中的 sl_simple_button_instances.h

- 为 sl_bt_evt_sm_bonding_confirm_id 事件添加处理程序。 此事件处理程序的主要工作是通知用户远程设备正在请求新的绑定。

- 为简单的按钮处理程序添加一个回调函数,以向蓝牙堆栈发送一个信号,指示按钮已被按下。 这会覆盖简单返回的默认回调。

- 添加外部信号事件处理程序。 此事件是响应接收到信号而引发的,例如在上一步中。 外部信号事件将用于确认绑定。

- 更改对 sl_bt_sm_configure 的调用以要求绑定确认,例如

- 重建和闪存。
- 与 EFRConnect 连接并像以前一样读取受保护的特征。 现在您将在控制台上看到如下消息:
按 PB0 确认绑定。 现在控制台将显示要在手机上输入的密码以进行绑定。 输入密钥以完成绑定过程。
提示:当堆栈发送未处理的事件时,使用事件处理程序中的默认情况打印出一条消息。 堆栈可能试图告诉您一些重要的事情。
超越基础
在这一点上,你已经采取了先进的tage 我们的堆栈必须提供的安全功能。 现在让我们通过明智地使用我们可以使用的功能来改进实现。 以下步骤是可选的并且彼此独立,您可以在每个步骤之后构建和闪烁以查看行为或一起尝试它们。
- 在失败的绑定尝试上断开连接。 这是检测威胁的好地方。 如果远程设备不支持加密/身份验证或只是没有正确的密钥,则可能是黑客。 所以,让我们断开连接。 尝试在 sl_bt_sm_bonding_failed_id 事件中添加对 sl_bt_connection_close() 的调用。 API 记录在这里。
您可以通过输入错误的密钥来测试此功能。 - 只允许在特定时间绑定。 这限制了攻击者必须形成绑定的时间,并使使用“仅允许绑定连接”功能成为可能。 设计人员可以选择如何启用或禁用可绑定模式。 出于演示目的,我们将使用 PB1 启用“设置模式”,并使用计时器在 30 秒后禁用它。
- 安装简单按钮界面的第二个实例。 这将启用 PB1。
- 修改回调以向堆栈发送不同的信号以启用/禁用绑定。 结果应如下所示:

- 修改外部信号事件处理程序,以便它处理这个新信号。 结果应该是这样的:

- 为 sl_bt_evt_system_soft_timer_id 事件添加事件处理程序。 这将用于禁用设置模式。

- 以下代码可用于启用可绑定模式并允许所有连接或禁用可绑定模式并仅允许来自绑定设备的连接:

- 在 sl_bt_system_boot_id 事件处理程序中添加以下调用

- 构建项目并将其闪存到设备。
- 尝试使用 EFRConnect 连接到设备。 连接应该失败。
- 现在尝试在连接 EFRConnect 之前按 PB1。 这一次连接会成功。 30 秒后,您将在控制台上看到一条消息,指示设备正在退出设置模式。 这意味着现在禁用了可绑定模式。
- 增加建立连接的安全性。 由于安全性是可选的,我们应该尽快请求加密连接,而不是依赖 GATT 特性。 API 记录在这里。 调用此 API 的一个好地方是在 sl_bt_evt_connection_opened_id 事件中。连接句柄在连接变量中可用。

安全身份
现在我们有了更安全的蓝牙设备,让我们改进身份验证步骤。 您已经在之前的培训实验室中了解了如何使用命令行验证保管库设备的安全身份。 在本节中,我们将了解一个 BLE 设备如何通过请求其证书链并发送质询来验证另一个 BLE 设备的身份。 所有安全保险库部件都拥有自己的设备证书和批次证书。 工厂和根证书被硬编码到客户端应用程序中,以启用整个证书链的验证。 有关安全身份的更多详细信息,请参阅 AN1268。
- 定义一个用于存储设备证明签名的全局缓冲区,如下所示:

- 将安全管理器配置设置为使用 JustWorks 配对。 这样做是为了加密连接。 在实践中,应该使用 MITM 保护,但为了保持实验室简单,我们将使用 JustWorks。 将对 sl_bt_sm_configure 的调用更改回以下内容:
此外,注释掉 system_boot 事件处理程序中对 setup_mode(true) 的调用。 - 从提供的材料中打开 helpers.c 并将内容复制到 app.c 中。 这些回调函数执行诸如分割证书以便它们可以通过 BLE 发送、验证证书链以及生成/验证质询等任务。
- 有必要确定最大传输单元 (MTU) 大小,以便可以对证书进行分段和重新组合。 定义一个全局变量来保存 MTU,如下所示:
然后为 GATT MTU 交换事件添加事件处理程序,如下所示:
- 可以读取三个用户数据特征。 这些特征用于传达设备证书、批次证书和质询。 回调函数用于处理这些用户读取请求。 添加一个处理程序来调用此函数,如下所示:
回调使用来自第 2 步的 MTU 来分段并根据需要发送证书。 它还处理发送签名的挑战。 - 客户端通过写入 GATT 特征之一来发送挑战,即由服务器签名的随机数。 出于这个原因,应用程序需要有一个处理用户写入请求事件的处理程序,如下所示:

- 添加安全身份支持 file项目:
- app_se_manager_macro.h、app_se_manager_secure_identity.c 和 app_se_secure_identity.h 从提供的材料到项目。 这些 files 包含一些辅助函数,用于获取证书大小、获取设备公钥和签署挑战等任务。
- 在 app.c 中包含 app_se_manager_secure_identity.h。
- 从提供的材料中导入提供的 gatt_configuration-attest.btconf。 这个 GATT 数据库称为安全证明,其中包括四个特征,将用于验证我们设备的身份。 其中包括设备证书、批次证书、质询和响应。
- 用于模拟网关等设备的客户端是作为一个完整的项目提供的,因为它构建起来更复杂。 一般来说,客户端的操作如下:
- 扫描宣传安全证明服务的设备并连接到它们。
- 发现 GATT 数据库服务和特征。
- 读取设备和批次证书,并使用存储在闪存中的工厂和根证书验证证书链。
- 向服务器发送随机挑战。
- 尝试验证对质询的响应。
- 如果任一验证失败,则关闭连接。
- 构建服务器项目并将其刷新到您的服务器 WSTK /radioboard。
- 从提供的材料中的客户端文件夹中导入客户端项目。 构建客户端项目并将其刷新到您的客户端 WSTK/radioboard。
- 按客户端 WSTK 上的重置并打开串行控制台。 客户端开始扫描宣传我们的安全身份服务的设备,并在找到时连接。
- 客户端将显示一些消息以表明它已找到具有所需服务的服务器以及有关证书链验证的状态消息。
- 如果验证通过,客户端将生成一个随机数,称为挑战,并将其发送给服务器。 服务器将使用其安全保存的私有设备密钥对质询进行签名,并将签名返回给客户端,这称为质询响应。 然后客户端使用之前收到的设备证书中的公钥来验证签名。 这样做是为了确认服务器确实拥有它声称拥有的私钥。 如果挑战被正确验证,则会显示一条消息。 否则,连接将关闭,并显示一条消息解释原因。
- 现在发送无效证书以确认验证确实有效。 您可以修改 user_read_request_cb() 以破坏证书数据或质询响应。
附录 A – I/O 功能和配对方法 
附录 B – 安全模式和级别
安全模式 1 是 Silicon Labs 堆栈中唯一支持低功耗蓝牙的模式。 级别如下:
- 1级无安全
- 2 级未经身份验证的加密配对
- 3 级认证配对与加密
- 具有强加密(ECDH 密钥交换)的 4 级认证安全连接
文件/资源
![]() |
silabs 21Q2 安全 BLE 设备安全实验室 [pdf] 用户手册 21Q2 安全BLE设备安全实验室,安全BLE设备安全实验室,安全实验室 |





