Enhancement
#14869 Added the
connected_attimestamp field to the$events/client_disconnectedevent payload. This enhancement enables tracking the original connection session time for disconnected clients, preventing outdated disconnect events from overriding newer connection states.Previously, when clients frequently reconnected due to unstable networks, delayed disconnect events could lead to incorrect session tracking. With this update, the
connected_atfield is now included in the event payload, aligning its behavior with system topics and ensuring accurate session state management.
Bug Fixes
Core MQTT Functionalities
- #14815 Fixed packet ID release for QoS 2 messages. Previously, if a client failed to send a PUBREL for the maximum configured number of pending QoS 2 messages and then disconnected, the packet IDs remained occupied even after exceeding the configured Max Awaiting PUBREL Timeout.
Installation and Deployment
#14797 Fixed macOS release package startup issue due to OpenSSL dynamic linking (backport #14624).
Previously, the EMQX ZIP package on macOS could fail to start because the
quicerapplication dynamically linked to the system-installed OpenSSL, which was not signed during the EMQX build process. Now we have disabled dynamic linking for OpenSSL, aligning with the OTP shipped on macOS. This ensures EMQX starts reliably on macOS 13 and later.
Authentication
- #14847 Fixed JWKS authentication failure for wildcard HTTPS endpoints. Previously, JWKS authentication failed to retrieve keys from HTTPS endpoints that used wildcard hostnames, preventing successful authentication.
- #14786 Fixed JWT authentication settings update when using an external JWKS endpoint. Previously, when updating JWT authentication settings with JWKS (key server) enabled in both the old and new configurations, some settings were not correctly applied.
REST API
- #14834 Fixed incorrect
Content-Typeheader when downloading data backup files. Previously, the response header for downloaded backup files incorrectly usedapplication/jsoninstead ofapplication/octet-stream.
Rule Engine
- #14824 Fixed HTTP 500 error in SQL Rule Tester when handling
detailskey in alarm events. Previously, when testingalarm_activatedoralarm_deactivatedevents in the SQL Rule Tester, certain values in thedetailskey could cause an HTTP 500 error due to improper handling of nested map keys.
Observability
#14800 Throttled
warninglevel logdropped_qos0_msg.#14793 Added trace log for
protocol_errorin MQTT connections.Previously, when a client sent invalid or unexpected MQTT packets causing a
protocol_error, EMQX logs provided limited details, making it difficult to diagnose the issue.For example, if a client sent a second
CONNECTpacket while already connected, EMQX would logsocket_force_closedwithprotocol_error, but without indicating the exact cause.With this update, EMQX now logs
unexpected_connect_packetwithconn_state=connectedbeforesocket_force_closed, providing clearer context for debugging protocol violations.
Plugin
#14802 Introduced a new CLI command for plugins:
emqx ctl plugins allow NAME-VSN
Breaking Changes
#14802 Starting from this version, plugin installation via the REST API or Dashboard requires explicit permission. Users must obtain this permission using the following CLI command before installing.
emqx ctl plugins allow NAME-VSNThis change enhances security by preventing unauthorized plugin installations. Users managing plugins via the API or Dashboard must adjust their workflows accordingly.