BlueZ外设端能否手动控制发起方密钥分发以获取IRK?
解决方案:BlueZ外设获取中心设备IRK实现重配对
环境信息
- 内核:板载Linux 4.9.84 armv7l
- BlueZ版本:5.65
- 对等设备:Android 12 及 iOS 16.6
- 角色:手机为中心设备,开发板为外设
问题概述
执行以下操作流程后:
- 通过btmgmt配置外设为可绑定状态:
btmgmt power off btmgmt connectable on btmgmt pairable on btmgmt le on btmgmt bondable on btmgmt power on btmgmt advertising on
- 手机与开发板完成配对
实际结果:手机成功连接并启用链路加密,但中心设备未分发IRK,无法解析中心设备的可解析MAC地址,导致无法利用已生成的LTK完成重配对。
核心原因:根据蓝牙Core v5.4 vol3,Part H. page 1602规范,当外设的发起方密钥分发未包含IdKey时,中心设备不会主动发送IRK。此前尝试修改IO能力(NoInputNoOutput)、切换配对模式(传统配对/安全连接),均无法调整发起方密钥分发配置。
可行解决方案
1. 修改BlueZ全局配置强制请求IdKey
编辑BlueZ主配置文件/etc/bluetooth/main.conf,在[General]段落中添加或修改以下配置项:
LEKeyDistribution = id
该配置会强制外设在配对的密钥分发阶段,向中心设备请求IdKey(对应IRK相关密钥),触发中心设备分发IRK。
2. 重启蓝牙服务使配置生效
执行命令重启BlueZ服务:
systemctl restart bluetooth
之后重新执行原有的btmgmt外设配置流程,再与手机完成配对,即可获取到中心设备分发的IRK。
3. 验证IRK存储状态
配对完成后,可查看BlueZ的配对信息存储目录/var/lib/bluetooth/<你的外设MAC地址>/<中心设备MAC地址>下的文件,确认其中是否包含IRK相关的条目,以此验证配置是否生效。
4. 适配Linux 4.9内核的额外注意事项
由于使用的Linux 4.9内核版本较旧,若上述配置未生效,需检查BlueZ编译时是否开启了CONFIG_LE_SECURITY相关编译选项。必要时可重新编译BlueZ,编译时添加--enable-le、--enable-security参数,确保低功耗蓝牙安全及密钥分发功能正常工作。
内容的提问来源于stack exchange,提问作者ayezang
相关产品推荐
相关产品推荐

