物联网后端数据可视化消息队列【免费下载链接】thingsboardAll-in-one IoT Platform - Device management, data collection, processing and visualization.项目地址https://gitcode.com/GitHub_Trending/th/thingsboard点击查看免费下载X.509 证书链X509 Certificate Chain是 ThingsBoard 设备预配置Device Provisioning三种内置策略之一它利用双向 TLS 握手过程中客户端提交的证书链在无需 Access Token 或 Username/Password 的前提下完成设备识别、注册与凭据自动更新。本文将以 ThingsBoard 设备配置文件Device Profile中的 X509 证书链策略为主题完整讲解该策略的能力边界、UI 配置步骤、CN 正则表达式编写规范并结合本仓库的源码实现与单元测试剖析其在传输层校验、设备预配置服务中的完整调用链帮助你正确落地证书即身份的 IoT 设备接入方案。一、策略概览X.509 证书链能做什么在 ThingsBoard 中设备预配置策略定义在设备配置文件Device Profile的 Provisioning 配置中。通过 common/data 模块的 DeviceProfileProvisionType 枚举 可以看到平台内置了三种策略ALLOW_CREATE_NEW_DEVICES允许设备通过预配置密钥Provision Device Key/Secret创建新设备CHECK_PRE_PROVISIONED_DEVICES仅允许预创建pre-provisioned的设备完成注册X509_CERTIFICATE_CHAIN基于 X.509 证书链完成设备身份识别与注册。X.509 证书链策略专门服务于双向 TLSmTLS通信场景其核心能力被官方帮助文档即 x509-chain-hint.md明确归纳为三点检查预配置设备check for pre-provisioned devices在设备已预先创建的前提下通过证书链确认设备身份并允许其接入更新 X.509 设备凭据update X.509 device credentials当设备已存在但持有的 X.509 凭据过期或过期替换时自动以证书链中的新证书更新设备凭据创建新设备create new devices在允许新设备注册的前提下根据证书链自动创建设备。与基于预配置密钥的两种策略不同X.509 证书链策略不再依赖用户在设备端预先烧录 Provision Device Key/Secret而是直接以证书链作为身份凭证。这意味着同一套设备侧配置可以安全地复用于多个租户/设备配置文件也避免了密钥泄露后被人复制用于冒充设备的问题。二、核心工作机制证书上传、CN 正则与整链提交根据 x509-chain-hint.md 的说明该策略的运作遵循以下三个硬性前提用户需先上传一张 X.509 证书到设备配置文件并设置一个正则表达式regular expression用于从客户端证书的 Common NameCN中提取设备名称客户端证书必须由这张已上传的设备配置文件证书签名策略才会将其视为可信任的设备身份客户端在建立 TLS 连接时必须提交完整的证书链整个证书链并且该链的最后一级必须是设备配置文件中的那张 X.509 证书。需要特别说明的是这里的证书链从底层链路看是叶子证书 → 中间证书 → 设备配置文件证书的顺序叶子证书在最前配置文件证书在链尾。服务端拿到整条链后会依次匹配其中的每一级证书用于定位对应的设备凭据或设备配置文件。策略的自动更新特性如果目标设备已经存在但其 X.509 凭据已过期例如证书到期后重新签发策略会自动使用证书链中的新设备证书来更新该设备的 X.509 凭据无需人工干预从而实现证书轮换的自动化。一个重要的使用限制上传到设备配置文件的证书既不应是知名 CA 的根证书也不应是其公开的中间证书。理由很直接——凡是该 CA 签发的证书链都会包含这张公开证书若将其绑定到某个设备配置文件则会导致所有持有该 CA 签发证书的客户端都被分流到这个配置文件破坏设备身份隔离。三、UI 配置实操在设备配置文件中启用 X.509 证书链策略在 ThingsBoard 前端该策略的配置表单由 device-profile-provision-configuration.component.html 中的X509_CERTIFICATE_CHAIN分支渲染。导航路径为设备配置文件Device Profiles→ 打开目标配置文件 → 选择 Transport Configuration 中的 Provisioning 标签页然后选择 Provision Strategy 为 X.509 Certificate Chain下拉框数据来自DeviceProvisionType枚举见 device.models.ts 中的定义选项即ALLOW_CREATE_NEW_DEVICES、CHECK_PRE_PROVISIONED_DEVICES、X509_CERTIFICATE_CHAIN。可选打开 Allow create new devices by X509 certificate 开关该开关对应数据类中的allowCreateNewDevicesByX509Certificate字段决定当设备不存在时是否允许自动创建。关闭时策略仅执行检查预配置设备 更新凭据开启时额外允许注册不存在的设备。填入 Certificate value证书内容将上述设备配置文件证书的 PEM 文本含-----BEGIN CERTIFICATE-----与-----END CERTIFICATE-----标记粘贴到多行文本框。这是必填项缺失会触发前端必填校验。填入 CN RegEx PatternCN 正则设置用于从设备证书 CN 中提取设备名的正则表达式同样为必填项。表单还提供了问号帮助按钮指向 x509-chain-regex-examples.md。后端对应的配置模型 X509CertificateChainProvisionConfiguration.java 恰好包含这三个字段与 UI 表单一一对应字段对应 UI 控件作用provisionDeviceSecret—内部字段兼容统一配置模型保留设备预配置密钥certificateRegExPatternCN RegEx Pattern从 CN 提取设备名的正则表达式allowCreateNewDevicesByX509CertificateAllow create new devices by X509 certificate是否允许自动创建不存在的新设备四、正则表达式CN RegEx编写指南正则表达式用于从 X.509 客户端证书的 Common Name 中提取设备名。官方帮助文档 x509-chain-regex-examples.md 给出了以下要点与示例正则语法基于Javajava.util.regex.Pattern因此在本地验证表达式时需选择Java 8 flavor例如使用 regex101 网站时务必切换为 Java 8 语法设备名取自正则中第一个捕获组group 1即代码实现中的matcher.group(1)详见下文源码分析。官方示例均以extractDeviceNameFromCNByRegEx提取的结果展示正则模式CN 样例提取结果(.*)\.company.comDeviceA.company.comDeviceA(.*)company.comDeviceAcompany.comDeviceAprefix(.*)suffixcompany.comprefixDeviceAsuffixcompany.comDeviceA\D\.(.*)\.\dcompany.comregion.DeviceA.220423company.comDeviceA最后一个示例展示了组合用法\D匹配非数字前缀region\.匹配句点\.\d匹配句点加数字序列.220423从而把中间的DeviceA精确定位出来。这些示例在仓库的单元测试 DeviceProvisionServiceTest.java 中被逐条验证测试中使用的 CN 正是DeviceA.company.com等样例。可以推断凡是符合 Java Pattern 语法、且包含至少一个捕获组的表达式都可使用但需保证在目标 CN 上执行find()后能稳定命中捕获组否则服务端会判定预配置失败。五、后端实现剖析从证书链到设备注册的完整调用链5.1 传输层入口链的接收与逐级匹配当 MQTT或其他传输协议客户端以双向 TLS 方式携带证书链发起连接时传输层会把整条链上报给 DefaultTransportApiService.validateOrCreateDeviceX509Certificate()。其处理逻辑如下使用正则-----BEGIN CERTIFICATE-----...-----END CERTIFICATE-----见该文件第 122 行定义的X509_CERTIFICATE_TRIM_CHAIN_PATTERN把证书链按 PEM 块拆分得到按客户端提交顺序排列的证书列表对列表中的每一级证书计算 SHA-3 哈希EncryptionUtil.getSha3Hash先用该哈希去匹配已存在的设备凭据若能命中且凭据类型为X509_CERTIFICATE则直接返回该设备信息此时设备无需走预配置流程若未命中设备凭据再用同一哈希去匹配设备配置文件的 Provision Device Key若能命中且配置文件策略为X509_CERTIFICATE_CHAIN则进入预配置流程provisionDeviceViaX509Chain逐级匹配直到链遍历完毕若全程未命中返回空响应连接被拒绝。从这段实现可以确认文档中的两个关键点客户端必须提交完整证书链服务端逐级寻找能对上号的那一级且链尾必须是设备配置文件证书该证书的哈希同时充当配置文件的 Provision Device Key 匹配键。5.2 核心服务provisionDeviceViaX509Chain设备预配置的核心逻辑位于 DeviceProvisionServiceImpl.provisionDeviceViaX509Chain()其执行流程与文档描述一一对应策略校验如果目标设备配置文件的预配置类型不是X509_CERTIFICATE_CHAIN直接抛出ProvisionFailedException提取 CN 与设备名从证书链中的设备证书即provisionRequest.getCredentialsData().getX509CertHash()对应链的第一级解析出 CN再按certificateRegExPattern提取设备名getCNFromX509Certificate()第 297-304 行调用SslUtil.readCertFile()与SslUtil.parseCommonName()解析证书 CN。CN 的解析实现位于 common/transport/transport-api 模块的 SslUtil.java通过 Bouncy Castle 的JcaX509CertificateHolder读取 Subject取第一个 CN RDN 的值extractDeviceNameFromCNByRegEx()第 306-317 行用Pattern.compile(regex)编译用户配置的正则对 CN 执行matcher.find()并返回matcher.group(1)若匹配失败抛出预配置失败异常查重与凭据更新以提取出的设备名在租户内查找设备。若设备已存在且其设备配置文件与目标一致则检查其凭据类型若凭据类型已是X509_CERTIFICATE则将凭据值更新为证书链中的新设备证书哈希调用updateDeviceCredentials()见第 226-232 行实现过期凭据自动更新返回成功响应携带更新后的设备凭据创建新设备若设备不存在且allowCreateNewDevicesByX509Certificate为 true则调用createDevice()创建新设备并为设备写入provisioned状态属性、推送ENTITY_CREATED与PROVISION_SUCCESS消息到规则引擎否则记录警告并抛出失败异常。值得注意的是provisionDevice()处理密钥/密钥凭据的传统入口第 120-170 行在遇到X509_CERTIFICATE_CHAIN策略时会直接抛出Invalid provision strategy type!说明该策略只能经由证书链路径触发不能被密钥预配置请求滥用——这是设计上对两种预配置模式的明确隔离。六、测试验证仓库中的可运行证据仓库为这套策略提供了完整的单元测试见 DeviceProvisionServiceTest.java测试夹具为 src/test/resources/provision/x509ChainProvisionTest.pem包含两张证书第一张是名为deviceCertificateX509ProvisionStrategy的设备证书叶子第二张是名为deviceProfileCertX509ProvisionStrategy的配置文件证书——即文档所说的链尾必须是设备配置文件证书的实证provisionDeviceViaX509Certificate第 120-139 行验证设备已存在时流程会正确查找设备、查找凭据并更新 X.509 凭据返回 SUCCESSprovisionDeviceWithIncorrectConfiguration第 142-151 行验证关闭允许创建新设备且设备不存在时抛出ProvisionFailedExceptionmatchDeviceNameFromX509CNCertificateByRegex第 154-163 行验证从真实 PEM 证书解析 CN 并按正则提取出的设备名为deviceCertificatematchDeviceNameFromCNByRegex第 166-194 行逐一验证上文表格中的全部正则示例。此外DefaultTransportApiServiceTest也覆盖了证书链校验与预配置的传输层路径。这些测试共同构成了一份可直接运行的策略行为规范开发者阅读它们即可确认自己对配置行为的理解与平台实现一致。七、实施要点与常见陷阱综合文档约束与源码行为在实际接入时请重点核对以下几点证书链的提交顺序客户端必须按叶子证书在前、设备配置文件证书在链尾的完整链提交只提交叶子证书将导致链尾匹配失败。配置文件证书的选型不要使用知名 CA 的根证书或公开中间证书应使用自己生成的私有 CA/自签名证书作为该配置文件的设备级签发证书并保证它只服务于本配置文件。正则必须含捕获组服务端取matcher.group(1)作为设备名正则不含捕获组或捕获组为空都会导致ProvisionFailedException。设备名唯一性预配置以租户 设备名查找目标设备正则提取出的名字必须能在租户内稳定唯一否则会命中错误设备或触发重名失败。凭据轮换是自动的设备证书过期重签后只要新证书仍由同一配置文件证书签发平台会自动更新凭据无需修改设备端接入参数。这套策略将设备身份与TLS 信任链绑定是 ThingsBoard 面向工业网关、批量设备上线与证书轮换场景的推荐预配置方案结合 x509-chain-hint.md 的帮助文案与上文源码链路即可在生产环境中安全地启用基于证书的零密钥设备接入。赞分享物联网后端数据可视化消息队列【免费下载链接】thingsboardAll-in-one IoT Platform - Device management, data collection, processing and visualization.项目地址https://gitcode.com/GitHub_Trending/th/thingsboard点击查看免费下载相关推荐ThingsBoard X509 证书链设备命名正则提取从证书 CN 到设备名的完整实践指南ThingsBoard X509 证书链设备命名正则提取从证书 CN 到设备名的完整实践指南 导读 在 ThingsBoard 的设备配置Device Pr物联网后端数据可视化消息队列ComfyUI 多平台部署快速搞定 NVIDIA、AMD 与国产加速卡的硬件兼容性ComfyUI 多平台部署快速搞定 NVIDIA、AMD 与国产加速卡的硬件兼容性 ComfyUI 的节点图跑在什么硬件上取决于两件事装对对应后端的 Py人工智能大模型媒体生成本地部署FinBERT2如何构建金融文本智能分析的下一代专业模型FinBERT2如何构建金融文本智能分析的下一代专业模型 FinBERT2是金融领域最先进的文本分析模型专为处理复杂的金融文档和研报而设计。这个开源项目基于人工智能大模型NLP预训练微调RAG金融科技创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?