An Azure service that enables bidirectional communication between internet of things (IoT) devices and applications.
Hello @Hoge, Florian
Thanks for the thorough diagnosis pulling the connection logs and pinpointing the exact cipher is the hard part, and it makes this straightforward to answer (even if it isn't the answer you were hoping for).
Short version: there's no way to temporarily re-enable TLS_RSA_WITH_AES_256_CBC_SHA, either as a hub setting or via a support exception. What you're hitting is the Azure-wide strong-cipher enforcement that took effect August 31, 2025, and per the documentation it applies to all existing and new IoT Hubs — "non-recommended (weak) cipher suites aren't supported after this date." It isn't tied to a minTlsVersion change on your hub, so there's no per-resource rollback; the removal is at the service/platform layer. Enforcement has been rolling out progressively, which is why some devices kept connecting past the formal date before finally being refused.
Why your devices break: the TLS_RSA_* suites are static-RSA (no forward secrecy) and were removed. IoT Hub now accepts only these strong suites — the common thread is ECDHE: ECDHE-RSA
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
- TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
ECDHE-ECDSA (public-cloud regions only)
- TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
- TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
Your device's TLS stack needs to offer an ECDHE suite in its ClientHello. One gotcha that trips up embedded stacks: when offering an ECDHE/ECDSA cipher, the client must also include a valid supported_groups (elliptic-curves) extension in the ClientHello, or the handshake still fails.
Permanent fix — firmware/TLS-stack update on the Quectel modules. If they use the Azure IoT C SDK, get on a TLS 1.2–capable tag and confirm the underlying TLS library (mbedTLS/OpenSSL/wolfSSL) is built to offer ECDHE suites plus a curve. If a given module genuinely can't do ECDHE at all, that unfortunately means a firmware variant change or device replacement — there's no server-side accommodation for static-RSA anymore.
Interim bridge to keep field devices online while you roll out firmware. The supported pattern is a local gateway that terminates the device's legacy TLS and re-originates a compliant connection to IoT Hub — for example, an Azure IoT Edge transparent/protocol gateway deployed near the fleet: devices connect to Edge locally, and Edge connects to IoT Hub with a modern cipher. A self-managed reverse proxy you control can work too, but note two constraints: (1) it must be on infrastructure that can accept the retired cipher inbound — most managed Azure frontends (App Service/Functions) also enforce strong ciphers, so they generally can't accept the legacy handshake and (2) it must preserve each device's IoT Hub identity/auth and MQTT semantics. So plan the bridge as local-gateway infrastructure, not a simple cloud TLS relay.
Pinpoint exactly which devices are still on the bad cipher. Use IoT Hub → Metrics → Successful connects and add a filter on the Cipher Suite (and/or TLS version) dimension — this shows the count of successful connections per cipher, so you can watch the fleet migrate in real time. For per-device TLS version you can also use the Connections diagnostic logs (note: TLS-version logging isn't available for devices connecting over HTTPS):
AzureDiagnostics
| where ResourceProvider == "MICROSOFT.DEVICES" and ResourceType == "IOTHUBS"
| where Category == "Connections" and OperationName == "deviceConnect"
| extend props = parse_json(properties_s)
| project DeviceId = props.deviceId, TLSVersion = props.tlsVersion
For the fully-disconnected devices: Device Update for IoT Hub only works for devices that can still reach the hub, so you'll need an out-of-band path — Quectel's own cellular FOTA (check their module docs for the relevant AT commands) or local USB/serial update. Getting a first wave back online via the gateway lets you then use Device Update for the rest.
One more defensive note: avoid any device logic that pins to a specific intermediate CA — Microsoft rotates those, and it's a second, independent way fleets like this break.
I'm sorry this lands as a hard "no" on the rollback, but the fastest route back to green is a staged firmware push to an ECDHE suite, with the Metrics cipher filter tracking recovery.
Links :
IoT Hub TLS support (supported cipher suites & enforcement):
https://learn.microsoft.com/azure/iot-hub/iot-hub-tls-support
Check TLS versions & cipher suites (metrics + KQL):
https://learn.microsoft.com/azure/iot-hub/iot-hub-tls-support#check-tls-versions-and-cipher-suites-for-iot-hub-devices
IoT Hub monitoring data reference (connect.success → TLSCipher dimension):
https://learn.microsoft.com/azure/iot-hub/monitor-iot-hub-reference#metrics
Configure TLS 1.2 in the IoT client SDKs:
https://learn.microsoft.com/azure/iot-hub/iot-hub-tls-support#tls-configuration-for-sdk-and-iot-edge
IoT Edge as a transparent gateway:
https://learn.microsoft.com/azure/iot-edge/iot-edge-as-gateway
Device Update for IoT Hub:
https://learn.microsoft.com/azure/iot-hub-device-update/understand-device-update
Thanks,
Manish