robot-notes — 機器人知識筆記 GitHub ↗
本章與本頁目次

調度

robot-notes /調度/底層通訊/MQTT over TLS(EMQX)

MQTT over TLS:用 EMQX 達成 TLS 1.2+ 安全

VDA5050 車隊、IoT 設備大多走 MQTT,但明文 MQTT(port 1883)誰都能連、誰都能訂閱 / 發布任何 topic。要安全,不是只「加個密」就好——安全是三層:傳輸加密、身份認證、權限授權。EMQX 這個常見的 MQTT broker 三層都內建,這篇講怎麼把它們設對。

相關:VDA5050(車隊走 MQTT)、實作小抄(adapter↔broker)、STM32 REST+TLS(MCU 端連 mqtts 的資源考量)。


1. 三層,缺一不可

MQTT 三層安全:① 傳輸加密 TLS(mqtts 8883,防竊聽)② 認證(誰能連,mTLS client 憑證最強)③ 授權 ACL(連上後限制能 pub/sub 哪些 topic);三層一起開才安全

只做加密,連線是看不到了,但「誰都能連、連上能亂發」;加了認證,冒充不了,但連上的設備還是能碰全車隊的 topic。三層一起開才完整:加密(別人看不到)+ 認證(冒充不了)+ 授權(越權不了)。

2. ① 傳輸加密:鎖 TLS 1.2 起跳

EMQX 預設就開一個 SSL/TLS listener 在 port 8883(mqtts),預設是單向(client 驗 server 憑證)(Enable SSL/TLS)。達成「TLS 1.2 以上」規範的要點:

3. ② 認證:從單向走到雙向 mTLS

預設單向只證明「broker 是真的」,但沒驗 client 是誰。要證明「連進來的是授權設備」,有幾種做法,最強的是雙向 TLS(mTLS)——broker 用 CA 驗每台 client 的 X.509 憑證:

(雙向 TLS 設定認證總覽)。其他認證方式:username/password(雜湊存)、JWT、PSK——可單用或疊在 TLS 上。對車隊,每台一張 client 憑證最乾淨(憑證的 CN/DN 還能當身份給授權層用)。

4. ③ 授權:ACL 限制每台只能碰自己的 topic

連上之後,用 ACL(存取控制清單) 限制「這個身份能 connect / subscribe / publish 哪些 topic」。依 client_id / username / 憑證身份設規則,讓每台設備只能碰自己的 topic,而不是全車隊。

把這三層串成「一次連線」,先後順序是這樣——握手加密、連線認證、每筆訊息授權:

MQTT mTLS 連線流程:① TLS handshake 雙向憑證(加密+認證)→ ② MQTT CONNECT broker 認證 → CONNACK → ③ SUBSCRIBE/PUBLISH 時 broker 查 ACL 授權;每次 pub/sub 都再過 ACL

5. EMQX 配置骨架(pseudo)

# EMQX 5.x(HOCON);確切鍵名以 EMQX 官方文件 / 你的版本為準
listeners.ssl.default {
  bind = "0.0.0.0:8883"
  ssl_options {
    cacertfile = "/etc/certs/ca.pem"        # 驗 client 憑證的 CA(mTLS 用)
    certfile   = "/etc/certs/server.pem"
    keyfile    = "/etc/certs/server.key"
    versions   = ["tlsv1.3", "tlsv1.2"]     # 鎖 1.2 起跳,不准更舊
    ciphers    = ["ECDHE-ECDSA-AES256-GCM-SHA384",
                  "ECDHE-RSA-AES256-GCM-SHA384"]
    verify               = verify_peer      # 要求並驗證 client 憑證
    fail_if_no_peer_cert = true             # 沒帶有效 client 憑證 → 拒連
  }
}
# 授權 ACL(概念):每台只能碰自己 serialNumber 的 topic
allow  pub/sub   topic = "vda5050/v2/ACME/${clientid}/#"
deny   all

6. 注意事項

結論

「MQTT 達成 TLS 1.2+ 安全」不是「打開 8883」這麼一句。完整的是:鎖 TLS 1.2+ 與強 cipher(加密)→ 雙向 mTLS 或強認證(認證)→ per-device ACL(授權),三層一起。EMQX 三層都內建,工作量在「設對 + 管好每台設備的憑證與權限」。

來源