ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Eclipse Mosquitto 1.1.2 修复解析:TLS 客户端证书校验默认值(SSL_VERIFY_PEER)缺陷与修复

Eclipse Mosquitto 1.1.2 修复解析:TLS 客户端证书校验默认值(SSL_VERIFY_PEER)缺陷与修复 后端消息队列消息路由【免费下载链接】mosquittoEclipse Mosquitto - An open source MQTT broker项目地址https://gitcode.com/gh_mirrors/mos/mosquitto点击查看免费下载Mosquitto 1.1.22013-01-30 发布是一个纯缺陷修复bugfix版本其核心修复点只有一个却事关安全客户端库中tls_cert_reqs未被默认设置为SSL_VERIFY_PEER导致客户端通过 TLS 连接 broker 时默认不校验服务器证书。本文将结合当前仓库源码剖析该缺陷的成因、影响范围、修复后的默认行为以及开发者如何在代码中显式控制证书校验策略。版本概览一次聚焦 TLS 安全的 bugfix 发布Mosquitto 1.1.2 发布于 2013 年 1 月 30 日属于 bugfix 系列版本不包含新功能。仓库中的 ChangeLog.txt 与该发布公告内容完全一致1.1.2 - 20130130 # Client library - Fix tls_cert_reqs not being set to SSL_VERIFY_PEER by default. This meant that clients were not verifying the server certificate when connecting over TLS. This affects the C, C and Python libraries.这一版本仅修改客户端库Client library不涉及 broker 端改动。源码与二进制包可从 Mosquitto 官方下载渠道获取。缺陷根因tls_cert_reqs缺失默认值在 TLS 握手过程中OpenSSL 通过SSL_CTX_set_verify()设置对端证书的校验策略其关键参数包括常量含义安全性SSL_VERIFY_PEER请求对端证书并验证其签名链与信任锚安全SSL_VERIFY_NONE不验证对端证书存在中间人风险1.1.2 之前的客户端库在初始化连接对象时没有把tls_cert_reqs设置为SSL_VERIFY_PEER。由于该字段在结构体初始化后默认值为 0而 0 恰好对应SSL_VERIFY_NONE结果就是只要客户端通过 TLS 连接 brokerOpenSSL 不会校验服务器证书是否由受信任的 CA 签发。攻击者只需提供一张任意自签证书就能伪装成目标 broker 对客户端实施中间人MITM攻击窃取或篡改 MQTT 会话中的凭据与业务消息。为什么默认值 0 会落在不校验分支从当前仓库源码看TLS 校验策略的判定逻辑位于 lib/net_mosq.c。当加载 CA 之后代码根据tls_cert_reqs的值选择调用 OpenSSL 的校验模式if(mosq-tls_cert_reqs 0){ SSL_CTX_set_verify(mosq-ssl_ctx, SSL_VERIFY_NONE, NULL); }else{ SSL_CTX_set_verify(mosq-ssl_ctx, SSL_VERIFY_PEER, mosquitto__server_certificate_verify); }可见tls_cert_reqs 0会直接落入SSL_VERIFY_NONE分支。因此1.1.2 之前的版本中只要应用没有主动调用mosquitto_tls_opts_set()指定校验级别TLS 连接就处于只加密、不验真的危险状态——数据传输虽被加密但服务器身份未被确认。修复后的默认行为源码级验证本次修复的核心动作就是在客户端库的初始化函数中为tls_cert_reqs显式赋默认值。当前仓库 lib/libmosquitto.c 的初始化代码位于#ifdef WITH_TLS编译分支内可以确认mosq-tls_cert_reqs SSL_VERIFY_PEER; mosq-tls_insecure false;也就是说修复后所有新建的struct mosquitto连接对象默认即要求校验证书且tls_insecure跳过校验的开关默认关闭。对应的结构体字段定义在 lib/mosquitto_internal.hint tls_cert_reqs;这一初始化发生在连接对象创建阶段mosquitto__init早于任何 TLS 握手因此无论应用后续是否显式设置 TLS 选项默认的安全行为都能得到保障。显式控制证书校验的 API 与调用链除默认值外开发者仍可通过公开 API 显式调整校验策略。相关接口集中在 lib/options.c1.mosquitto_tls_opts_set()设置证书校验级别函数原型位于 lib/options.cint mosquitto_tls_opts_set(struct mosquitto *mosq, int cert_reqs, const char *tls_version, const char *ciphers);其中第一个参数cert_reqs直接写入mosq-tls_cert_reqsmosq-tls_cert_reqs cert_reqs;推荐传入SSL_VERIFY_PEER同时该函数还负责设置 TLS 版本默认tlsv1.2与密码套件列表。传入非法值会返回MOSQ_ERR_INVAL在未编译WITH_TLS的构建中则返回MOSQ_ERR_NOT_SUPPORTED。2.mosquitto_tls_insecure_set()谨慎使用的跳过校验开关函数位于 lib/options.cint mosquitto_tls_insecure_set(struct mosquitto *mosq, bool value);仅当确需连接使用自签名证书的内部测试环境时才建议将value设为true生产环境应保持false。该开关配合默认的SSL_VERIFY_PEER共同构成客户端证书信任策略的两道防线。3. 完整调用链结合 lib/net_mosq.c 可梳理出完整流程应用调用mosquitto_tls_set()设置 CA 文件/路径或启用系统证书tls_use_os_certsTLS 上下文建立后net__tls_load_ca()加载信任锚根据mosq-tls_cert_reqs决定SSL_CTX_set_verify()的校验模式非 0 时还会注册mosquitto__server_certificate_verify作为校验回调若设置了tls_pw_callback同时注册私钥口令回调加载客户端证书链与私钥SSL_CTX_use_certificate_chain_file。也就是说修复后的默认SSL_VERIFY_PEER只有在客户端明确配置了 CAcafile/capath/系统证书时才真正生效——这也是客户端 TLS 校验的前提条件。影响范围C、C 与 Python 客户端库发布公告明确指出该缺陷影响三类客户端库C 库libmosquitto缺陷的直接载体初始化逻辑与 TLS 选项处理均位于 lib/libmosquitto.c 与 lib/options.cC 库libmosquittopp其实现封装并复用了 C 库的 TLS 选项与连接逻辑因此底层默认值修复后 C 绑定同步受益Python 库同样基于 libmosquitto 的 TLS 行为受同一缺陷影响随本次修复一并解决。由于修复发生在共享的底层初始化逻辑中三者的默认行为在 1.1.2 之后保持一致不显式调用mosquitto_tls_opts_set()时证书校验默认开启。实践建议更新到修复版本凡使用 Mosquitto 1.1.2 之前版本且通过 TLS 连接 broker 的部署应尽快升级客户端库否则连接处于不校验服务器证书的状态显式声明校验级别即使是修复后的版本也建议在代码中显式调用mosquitto_tls_opts_set(mosq, SSL_VERIFY_PEER, NULL, NULL)避免依赖隐式默认值提升可读性与可维护性正确配置 CASSL_VERIFY_PEER生效的前提是已通过mosquitto_tls_set()指定可信 CA文件、路径或系统证书并使用由该 CA 签发的服务器证书测试环境与生产的策略分离仅对自签名证书的内部测试环境使用mosquitto_tls_insecure_set(mosq, true)生产环境保持默认校验关注 broker 端配套配置客户端校验修复后broker 端应使用有效证书链参见 mosquitto.conf 中cafile、certfile、keyfile等 TLS 监听配置确保双向信任关系完整。小结Mosquitto 1.1.2 虽是一个单点修复的 bugfix 版本但它修正的TLS 连接默认不校验服务器证书问题对 MQTT 客户端安全至关重要。以当前仓库源码为准修复后的默认行为已固化为tls_cert_reqs SSL_VERIFY_PEER见 lib/libmosquitto.c并在 lib/net_mosq.c 的 TLS 上下文初始化中强制启用SSL_VERIFY_PEER校验。理解这条默认值链路有助于开发者正确配置 Mosquitto 客户端 TLS 信任策略避免加密但不验真的安全误区。赞分享后端消息队列消息路由【免费下载链接】mosquittoEclipse Mosquitto - An open source MQTT broker项目地址https://gitcode.com/gh_mirrors/mos/mosquitto点击查看免费下载相关推荐Tolaria ADR-0100用前端合成的 Vault 根行统一文件夹导航模型Tolaria ADR 0100用前端合成的 Vault 根行统一文件夹导航模型 Tolaria 的侧边栏文件夹树需要让用户能一键回到 Vault 根目录、浏后端消息队列消息路由SafeLine 忘记或泄露数据库密码时如何用管理脚本重置 POSTGRES_PASSWORD 并重启容器SafeLine 忘记或泄露数据库密码时如何用管理脚本重置 POSTGRES_PASSWORD 并重启容器 SafeLine雷池的控制台配置存放在 Pos后端消息队列消息路由Mosquitto 2.0.13 发布Broker 与客户端库关键缺陷修复全解析Mosquitto 2.0.13 发布Broker 与客户端库关键缺陷修复全解析 Mosquitto 2.0.13 是 Eclipse Mosquitto 在后端消息队列消息路由创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表