Überblick
DDS-Security 1.2 §9.3 spezifiziert ein Plugin-Interface fuer Authentication; das vorgesehene Default-Modell ist X.509-PKI mit Diffie-Hellman-Handshake (§10). ZeroDDS implementiert beide Pfade in crates/security-pki:
- X.509-Identity — der „echte" Pfad fuer Production. CA-signierte Certs als Identity, periodische Revocation-Checks via CRL/OCSP.
- Pre-Shared-Key (PSK) — der Spec-konforme Fallback fuer Lab-Setups oder embedded ohne PKI-Infrastruktur. §10.7.
Pro Participant gibt es einen Trust-Anker (eine oder mehrere CA-Certs), ein eigenes Identity-Cert/Private-Key-Paar, und optional eine CRL/OCSP-Quelle. Alles steckt im PropertyQosPolicy am DomainParticipantQos — siehe Cookbook-Rezept §1.
Identity & Trust-Anker
X.509 Identity-Cert DDS-Security 1.2 §9.3.2.1 + §10.3.1
Crate: crates/security-pki/src/identity.rs · identity_token.rs
Format: PEM-encoded X.509-Cert. Subject-Name aus Cert wird zu SubjectName für AccessControl-Lookup. ZeroDDS akzeptiert RSA (2048+), ECDSA (P-256/P-384/P-521) und Ed25519.
Trust-Chain-Validation: via rustls-webpki. Caller liefert ein oder mehrere CA-Certs als Trust-Anker (Property dds.sec.auth.identity_ca); jeder Remote-Cert muss dorthin chainen. Selbst-signierte Roots sind erlaubt fuer geschlossene Deployments.
IdentityToken (Wire-Form) §10.3.2.1
Wire-Repräsentation des Identity-Cert auf SPDP-Discovery-Beacons. Trägt das DER-encoded X.509-Cert plus eine Hash-Algorithm-ID. Wird in PID_IDENTITY_TOKEN als ParameterList-Item übertragen. Implementation: identity_token.rs.
3-Way-Handshake
HandshakeRequest → Reply → Final DDS-Security 1.2 §9.3.3 + §10.3.2.2-§10.3.2.4
Crate: crates/security-pki/src/handshake_token.rs
Flow:
- Request (Initiator → Replier): IdentityToken + AuthRequestToken (zufällige 32-Byte Challenge1) + DH-PublicKey-A.
- Reply (Replier → Initiator): IdentityToken + Challenge1-Echo + AuthRequestToken (Challenge2) + DH-PublicKey-B + Hash_C1 (HMAC über Challenges + DH-Keys, mit Replier-Identity signiert).
- Final (Initiator → Replier): Challenge2-Echo + Hash_C2 (analog, mit Initiator-Identity signiert).
Nach erfolgreichem Handshake leiten beide Seiten via HKDF aus dem DH-SharedSecret das Key-Material für den Cryptographic-Plugin ab (siehe Cryptographic-Plugin Reference).
DH-Kurven: P-256 (Default), P-384, P-521. Implementiert via ring-Crate.
AuthRequest-Challenges: 32 zufällige Bytes pro Seite, geschützen gegen Replay-Attacks. Implementation: auth_request.rs.
Revocation — CRL + OCSP
CRL — Certificate Revocation List RFC 5280 §5
Crate: crates/security-pki/src/crl.rs
Mechanik: CA publisht regelmäßig eine signierte Liste der revoked Serial-Numbers. ZeroDDS lädt die CRL (Property dds.sec.auth.identity_crl = file:/path) und prüft jeden Handshake-Remote-Cert gegen die Liste. Match → Authentication abgelehnt.
Lookup: parse_crl_serials(der) -> Vec<Vec<u8>> + validate_crl(der, cert_serial) -> Result<()>. Einfache Linear-Search; bei großen CRLs (10k+ Einträge) ist eine BTreeMap-Wrapper-Schicht in Phase-2.
Aktualisierungs-Strategie: CRL hat eine nextUpdate-Frist; CRL-Re-Load passiert beim Participant-Start. Live-Reload ohne Restart ist Roadmap.
OCSP — Online Certificate Status Protocol RFC 6960
Crate: crates/security-pki/src/ocsp.rs
Mechanik: Live-Lookup pro Cert via OCSP-Responder; ZeroDDS implementiert OCSP-Stapling (Cert trägt eine kürzlich signierte OCSP-Response). Cert-Holder muss die Stapling-Response in der IdentityStatusToken-Property mitliefern.
Wann OCSP statt CRL: große Deployment-Skalen (10k+ Certs), Real-Time-Revocation-Reaktion. OCSP-Stapling reduziert Latency (kein Live-Round-Trip pro Cert), bedeutet aber Lifetime-Aufwand am Cert-Holder.
IdentityStatusToken (Wire-Form) DDS-Security 1.2 §10.3.2.5
Crate: crates/security-pki/src/identity_status.rs
Wire-Repräsentation des Revocation-Status eines Remote-Certs. Drei States: good (Cert ist gültig, expiry-Zeitpunkt im Token), revoked (Cert revoked, optional OCSP-Response als Beweis), unknown (Status unbekannt). Wird über SEDP-builtin-topic DCPSParticipantStatelessMessage propagiert.
Multi-Tier-Delegation
DelegationLink — Chained-Authority DDS-Security 1.2 §9.4.1.2.4
Crate: crates/security-pki/src/delegation.rs
Use-Case: in Multi-Tenant-Setups will man nicht jeden Participant direkt von der Root-CA signieren. Stattdessen: Root → Tenant-CA → Participant-Cert. Spec erlaubt mehrere Delegations-Stufen, sofern jede Stufe eine signierte Delegation-Behauptung trägt.
API: DelegationLink::new(subject, authority, scopes), sign(pkcs8_key), verify(public_key). Implementation via ECDSA-Signatur (gleiche Kurve wie Identity).
Validation: AccessControl-Plugin (siehe Security Reference §AC) prüft beim Permissions-Match die Delegation-Chain — Subject darf nur Topics nutzen, die in der eigenen Authority-Subset liegen.
Pre-Shared-Key-Fallback
Builtin PSK-Authentication DDS-Security 1.2 §10.7
Crate: crates/security-pki/src/psk.rs
Mechanik: Beide Participants teilen einen Pre-Shared-Key (32 Byte). Der „Handshake" reduziert sich auf einen Mutual-MAC-Check über zwei Nonces. Kein DH, kein Cert, kein CA.
Wann nutzen:
- Lab/Test-Setups ohne PKI-Infrastruktur.
- Embedded ohne genug Speicher für Cert-Parsing (Cortex-M3/M0).
- Closed-Network mit Hardware-Provisioning (Smart-Card mit eingravierter PSK).
Limitierung: kein Key-Rotation ohne Re-Provisioning. Keine Permissions-Subject-Identität (Permissions-XML kann nicht pro Participant differenzieren). Skaliert nicht jenseits weniger Peers (PSK pro Participant-Pair wäre N×N Keys).