Einstellungen
Dieser Assistent richtet den EXO Signature Gateway ein. Führe die Schritte der Reihe nach aus. Bereits abgeschlossene Schritte sind grün markiert.
Es ist noch ein Standard-/Platzhalter-Passwort aktiv (admin bzw. changeme). Bitte jetzt ein sicheres Passwort setzen.
Der öffentliche DNS-Name dieses Servers (z.B. mail.contoso.com).
Er wird für Let's Encrypt, das TLS-Zertifikat und den EXO Outbound Connector verwendet.
Aktiviert HTTPS für das Web-UI und stellt das TLS-Client-Zertifikat bereit, das der EXO Inbound Connector für die Signaturprüfung benötigt (nur SMTP-Modus). Drei Wege — je nachdem, ob Port 80 offen ist und ob schon ein Zertifikat vorliegt.
2 · Vorhandenes Zertifikat importieren (PFX/PKCS#12)
Für Betreiber, die Port 80 nicht öffnen wollen und bereits ein Zertifikat haben (auch Wildcard oder interne CA). Das Zertifikat muss zum Hostnamen oben passen.
3 · Let's Encrypt über DNS-01 (ohne Port 80)
Ohne offenen Port 80 und ohne vorhandenes Zertifikat: Du setzt einen TXT-Record im DNS, danach stellt Let's Encrypt aus.
Ein Zertifikat ist aktiv. Nach einer Neuausstellung wechselt das Web-UI automatisch zu HTTPS; HTTP wird weitergeleitet.
Wähle, wie bearbeitete Mails zurück an Exchange Online geliefert werden. Die Wahl bestimmt, welche weiteren Schritte nötig sind.
S/MIME erfordert SMTP Port 25 oder IMAP + Graph. Im Modus Graph API wird der Haken entfernt und lässt sich nicht setzen.
Präfix für alle in Exchange angelegten Objekte (Outbound Connector, Transportregeln, Verteilerlisten) und den Namen der App-Registrierung. Jetzt setzen — eine spätere Änderung wirkt erst nach erneutem Ausführen des Assistenten.
1 · Bootstrap-App (Login-Registrierung)
Für den Setup-Login wird eine eigene App-Registrierung benötigt (Microsoft-
Public-Clients erlauben unsere Redirect-URI /auth/callback nicht).
Hast du bereits eine, trage nur die Client-ID ein — andernfalls lege sie so an:
- Öffne das Entra Admin Center → App-Registrierungen
- Klicke „Neue Registrierung"
- Name: z.B.
EXO Signature Gateway Login - Kontotyp: Nur Konten in diesem Organisationsverzeichnis
- Redirect-URI-Typ „Public client/native (mobile & desktop)" wählen (im Anmelde-Dialog so benannt; unter Authentifizierung heißt dieselbe Plattform „Mobile and desktop applications"). Redirect-URI exakt:
https://hv01.test.zarenko.net/auth/callback
Kein Port, kein Slash am Ende — sonst AADSTS50011. Gleich mit hinzufügen:http://localhost:8080/auth/callback(Localhost-Notausgang).Warum diese Plattform (nicht „Web"/„SPA")?
„Web" verlangt für den Code-Austausch immer ein Client-Secret (auch mit aktivierten öffentlichen Clientflows) →AADSTS7000218. „SPA" verlangt den Token-Austausch per Browser-CORS-Request — unserer läuft serverseitig →AADSTS9002327. „Mobile and desktop applications" erlaubt als einziger Typ PKCE ohne Secret UND serverseitigen Austausch ohne Origin-Zwang. - Klicke Registrieren
- Unter „Authentifizierung" ganz unten: „Öffentliche Clientflows zulassen" → Ja stellen und speichern.
Muss explizit an sein — wird beim Anlegen der Plattform nicht zuverlässig automatisch gesetzt. - Kopiere die Anwendungs-ID (Client-ID) und füge sie unten ein
2 · Als Entra-Administrator anmelden
Erstellt nach erfolgreichem Entra-Login (Schritt 4).
Für sehr hohes Mail-Aufkommen können mehrere App-Registrierungen im Round-Robin genutzt werden, um die Graph-API-Drosselung zu verteilen.
Dieser Schritt ist optional. Bei < 500 Postfächern ist eine App ausreichend.
Private S/MIME-Schlüssel werden in Azure Key Vault gespeichert. Jede Signierung ruft die Key Vault Sign API auf — der Schlüssel verlässt Azure nie. Optional und benötigt eine Azure-Subscription — grundsätzlich empfehlenswert, besonders wenn das Gateway selbst in Azure läuft. Ohne Azure-Subscription kann dieser Schritt übersprungen werden.
Key Vault URL direkt unten eintragen — oder oben den Assistenten aktivieren.
Erstellt in Exchange Online (Loop-Back-Architektur):
- Outbound Connector →
hv01.test.zarenko.net:25(EXO → Gateway) - Inbound Connector ←
hv01.test.zarenko.net(Gateway → EXO, TLS required) - Transport Rule: alle ausgehenden Mails via Gateway, außer
X-Sig-Applied: 1
Erstellt zwei Transport-Regeln in Exchange Online:
- Signierte Mails: Externe signierte Eingangs-Mails werden über das Gateway geleitet.
Das Gateway entfernt S/MIME-Signatur, sammelt Public Key des Absenders und ergänzt den Betreff
(
[signiert von Max Mustermann]). - Verschlüsselte Mails: Das Gateway entschlüsselt mit dem privaten Schlüssel des
internen Empfängers und ergänzt Betreff (
[verschlüsselt]oder[verschlüsselt, signiert von …]).
Voraussetzung: privater Schlüssel unter S/MIME → Signatur-Zertifikate importiert.
Sende eine Test-Mail durch den Service und bestätige, dass die Signatur korrekt eingefügt wird.
Geht jeden Punkt durch, den ein laufendes Gateway erfüllen muss — Erreichbarkeit, Anmeldung, Exchange, Signaturvorlage, aktivierte Postfächer, Rückweg, Benachrichtigung.
Ohne Entra-Konto funktioniert der SSO-Login nicht. Trage mindestens einen Admin-UPN ein, damit du dich künftig mit deinem Microsoft-Konto anmelden kannst.
Entra-Konten verwalten →
Der Update-Watcher ist ein systemd-Dienst auf dem Host, der Aktualisierungen
aus dem Web UI (Erweitert → Gateway aktualisieren) entgegennimmt.
Bei einer Azure-Neuinstallation (azure-vm-setup.ps1) wird er
automatisch eingerichtet; auf anderen Wegen (selbst gehostet – z. B.
Linux-Host, Raspberry Pi –, on-prem, reines docker compose)
einmalig mit dem Installer unten.
● Service nicht erkannt — bitte einmalig per SSH einrichten.
Einrichtung auf dem Host (einmalig)
Am einfachsten per SSH auf dem Host, aus dem Gateway-Verzeichnis:
sudo bash install-update-watcher.sh
Oder den systemd-Dienst von Hand anlegen (führt dasselbe aus):
ssh azureuser@hv01.test.zarenko.net
sudo chmod 755 /opt/exo-gateway/update-watcher.sh
sudo tee /etc/systemd/system/exo-gateway-updater.service > /dev/null << 'UNITEOF'
[Unit]
Description=EXO Gateway Update Watcher
After=docker.service
Requires=docker.service
[Service]
ExecStart=/opt/exo-gateway/update-watcher.sh
Restart=always
RestartSec=10
User=root
[Install]
WantedBy=multi-user.target
UNITEOF
sudo systemctl daemon-reload
sudo systemctl enable --now exo-gateway-updater
sudo systemctl status exo-gateway-updater --no-pager
Nach ca. 60 Sekunden schreibt der Service seinen ersten Heartbeat — dann wird dieser Schritt automatisch als erledigt markiert (Seite neu laden).