Überblick — RTPS vs. TLS
DDS-Security 1.2 spezifiziert die Crypto am RTPS-Submessage-Layer: jedes Sample wird mit AES-GCM verschlüsselt, Headers mit AES-GMAC signiert. Das passiert vor dem UDP-Send, ohne dass der Transport selbst kryptografisch sein muss. Folge: DDS-Security funktioniert über UDP, TCP, Shared-Memory, Unix-Domain-Sockets oder TSN — kein Transport-spezifischer Crypto-Stack nötig.
TLS kommt im ZeroDDS-Stack außerhalb des RTPS-Wire-Pfads ins Spiel — bei den Bridge-Daemons, die Nicht-RTPS-Protokolle terminieren (CoAP, MQTT, AMQP, WebSocket) und deren Standard-Sicherheit TLS ist. Plus bei DDS-XRCE, wo die Spec selbst DTLS als Wire-Security vorsieht (§7.4).
bridge-security TLS-Layer
ServerConfig + Client-Auth rustls 0.23 · TLS 1.2/1.3
Crate: crates/bridge-security/src/tls.rs
Zwei Builder-Funktionen:
load_server_config(cert_path, key_path) -> Arc<ServerConfig> — Server-only TLS (Bridge-Daemon präsentiert sich, Client braucht kein Cert).
load_server_config_with_client_auth(cert_path, key_path, ca_path) -> Arc<ServerConfig> — mTLS, Client muss ebenfalls Cert vorlegen, das gegen ca_path chainet.
Wer nutzt das:
SIGHUP-Reload: Bridge-Daemons re-lesen die TLS-Files beim SIGHUP-Signal (für Cert-Rotation ohne Process-Restart). Implementation siehe pro Daemon.
ClientConfig (für Bridge-Initiator-Mode) rustls 0.23
Manche Bridges (z.B. MQTT-Outbound zu einem externen Broker) sind TLS-Client. rustls::ClientConfig::builder().with_root_certificates(...).with_no_client_auth() für Standard-CA-Validation; .with_client_auth_cert(...) für mTLS.
Setup-Pattern analog zu Server-Config, aber Client-seitig. Implementation in crates/bridge-security/src/ctx.rs.
DTLS in DDS-XRCE
DDS-XRCE DTLS-Profile OMG DDS-XRCE 1.0 §7.4
Crate: crates/xrce/src/transport_dtls.rs
XRCE (eXtremely Resource-Constrained Environments) ist ein DDS-Profil für MCUs und IoT-Devices, die nicht den vollen DDS-Stack tragen. Die Spec definiert DTLS (Datagram-TLS, RFC 9147) als Wire-Security-Option — passt zu UDP-basierten Constrained-Devices ohne TCP-Handshake-Overhead.
Wann nutzen: XRCE-Client auf einem Cortex-M4/M7 (z.B. ESP32-S3, STM32F7), der via UDP gegen einen XRCE-Agent kommuniziert. DTLS verschlüsselt den Wire-Pfad, ohne dass der Constrained-Device DDS-Security-Crypto selbst implementieren muss.
Spec-Coverage: DDS-XRCE 1.0 Spec-Coverage →
WebSocket Secure (wss://)
WebSocket-Bridge mit TLS-Terminierung RFC 6455 + RFC 8446
Crate: crates/websocket-bridge
Pattern: Browser-Clients (typescript-wasm) können keine UDP-Sockets nutzen — sie sprechen WebSocket gegen einen ZeroDDS-WebSocket-Bridge-Daemon, der UDP-RTPS in beide Richtungen umsetzt. Für Production: TLS terminiert in der Bridge (wss://).
# Bridge mit TLS starten
zerodds-websocket-bridge \
--listen 0.0.0.0:9001 \
--domain 0 \
--tls-cert /etc/zerodds/server.crt \
--tls-key /etc/zerodds/server.key
Browser-Client: const ws = new WebSocket('wss://bridge.example.com:9001').
Vertrauensmodell: Browser vertraut der Bridge (Standard-CA-Chain). Was zwischen Bridge und DDS-Cluster passiert, ist Server-Side-Setup — typisch DDS-Security mit eigenem PKI-Trust-Anker. Das heisst: TLS terminiert in der Bridge; DDS-Security-Crypto setzt von dort weiter zum Peer ein.
Setup-Rezept: Security Cookbook §1 (PKI-Trust-Anker) für die DDS-Side, plus dieser TLS-Snippet für die Browser-Side.
Cipher-Suites & Versions
ZeroDDS verlässt sich auf rustls für TLS — das heisst: TLS 1.3 voll, TLS 1.2 mit AEAD-only Suiten. Kein TLS 1.0/1.1 (rustls supportet die gar nicht erst).
| TLS-Version | Status | Cipher-Suiten (rustls-Default) |
| TLS 1.3 | ✓ bevorzugt | TLS_AES_256_GCM_SHA384, TLS_AES_128_GCM_SHA256, TLS_CHACHA20_POLY1305_SHA256 |
| TLS 1.2 | ✓ Fallback | ECDHE-ECDSA-AES256-GCM-SHA384, ECDHE-ECDSA-AES128-GCM-SHA256, ECDHE-ECDSA-CHACHA20-POLY1305 + RSA-Varianten |
| TLS 1.1 / 1.0 | ✗ nicht supported | rustls hat das nicht implementiert |
| SSLv3 | ✗ nicht supported | — |
Compliance-Nutzen: TLS-1.2-AEAD-only + TLS 1.3 entspricht NIST SP 800-52 Rev. 2, PCI-DSS 3.2.1, FIPS 140-3 Mode (rustls hat eine separate FIPS-validated Variante via aws-lc-rs-Backend, kein Default).
Cert-Bundle-Format
Alle TLS-Funktionen in ZeroDDS akzeptieren PEM-Format:
# Cert-File (cert + intermediate-chain, root NICHT enthalten):
cat server.crt intermediate.crt > cert-bundle.pem
# Key-File (PKCS#8 oder PKCS#1, encrypted oder cleartext):
# encrypted: openssl pkcs8 -in key.pem -topk8 -out key.pk8 -nocrypt
Trust-Anker für Client-Auth-mTLS: separate PEM-Datei mit allen CA-Certs, die als Client-Cert-Issuer akzeptiert werden sollen. Pro Bridge-Daemon konfigurierbar.
Cross-Reference zur DDS-Side: die DDS-Security-PKI nutzt die gleichen PEM-Cert-Files (sieht PKI Governance §1). Das macht es einfach, eine einzige Cert-Hierarchie für RTPS-DDS-Security + Bridge-TLS zu nutzen.