Hallo,
hat jemand einen Lösungsvorschlag, wie man Mailcow unter Traefik auf einem Host mehrere Domains mit getrennten Zertifikaten zuweisen kann?
Für praxiserprobte Vorschläge würde ich mich freuen. THX.
Hallo,
hat jemand einen Lösungsvorschlag, wie man Mailcow unter Traefik auf einem Host mehrere Domains mit getrennten Zertifikaten zuweisen kann?
Für praxiserprobte Vorschläge würde ich mich freuen. THX.
Vielleicht etwas genauer.
In Mailcow befinden sich beispiel.de, beispiel.net und beispiel.com.
Nun möchte ich aber, wenn ich beispielsweise "mail.beispiel.net" aufrufe nur die Zertifikat-Infos von "beispiel.net" einsehen kann und NICHT ebenso von "beispiel.de" und "beispiel.com". Dovecot, Postfix und Nginx sollen die passenden Zertifikate von den jeweiligen Domains geladen haben.
Das klappt perfekt mit SNI ohne Traefik. Aber das ist nicht mein Ansatz.
Wenn es nur um Web mit Traefik geht sollten sich die Zertifikate einzeln definieren und über Matcher Regeln zuweisen lassen.
So wirklich oft nutz ich Traefik bei mir aber auch nicht.
Wenn Interesse besteht, kann ich später mal eine kleine Anleitung, was Traefik in Kombination mit Mailcow und 2 (oder mehrere) Domains betrifft, veröffentlichen.
Stichworte sind:
- docker-compose.override.yml
- Certdumper
- Hook-Script
Ich habe es soweit hinbekommen. Traefik erstellt ein WildCard-Zertifikat pro Domain (Hab mich für WildCard entschieden). Diese werden später vom Certdumper (in docker-compose.override.yml integriert) in das richtige .cem - und .key-Format für Mailcow "gedumpt". Dieser Certdumper erstellt dann wiederum jeweils ein Ordner in '/opt/containers/mailcow/data/assets/ssl' mit den jeweiligen Domain-Namen, wo sich die jeweils passenden WildCard-Zertifikate befinden. Das Hook-Script, welches vom Certdumper gesteuert wird, kopiert die Zertifikate von den erstellten Ordnern dann in die richtigen Bereiche für Mailcow. Sobald abgeschlossen, startet Certdumper die betreffenden Container von Mailcow neu. Somit sind die Zertifikate dann geladen.
Das war nur grob. Es gibt noch einige Vorarbeiten hierzu.
Darf ich mal den Hintergrund erfahren? Warum machst Du das?
Wenn ich z.B. "mail.domain.com" aufrufe, dann möchte ich nicht, daß in den Zertifikats-Infos im Browser auch die Zertifikatsinfos von "mail.anderedomain.net" stehen.
Jede in Mailcow eingetragene Domain soll sein explizites Zertifikat bekommen.
Das ist mit der 'normalen' Mailcow-Installation mit SNI kein Problem.
Wenn jedoch Traefik davor geschaltet ist, wird es heikler.
Das sollte mit den von mir verlinkten Einstellungen in Traefik möglich sein damit die Zertifikate explizit getrennt ausgestellt werden. Bzw wenn du die von außen irgendwie mit rein gibst müssen sie da schon getrennt ausgestellt sein.
Das sollte mit den von mir verlinkten Einstellungen in Traefik möglich sein damit die Zertifikate explizit getrennt ausgestellt werden.
Das ist nur ein kleiner Teil dessen. Dovecot und Postfix sollen ja auch die Zertifikate erhalten.
Was Du hier beschreibst sind in erster Linie nur die Zuweisungen von Zertifikaten an den entsprechenden Sub-Domains.
Hier meine Dateien:
traefik.yml
certificatesResolvers:
cloudflare:
acme:
email: acme@domain.de
storage: "/etc/traefik/acme.json"
#caServer: https://acme-staging-v02.api.letsencrypt.org/directory
keyType: EC384
dnsChallenge:
provider: cloudflare
propagation:
delayBeforeChecks: 10
resolvers:
- "1.1.1.1:53"
- "1.0.0.1:53"
entryPoints:
ping:
address: ':88'
web:
address: ':80'
http:
redirections:
entryPoint:
to: websecure
scheme: https
websecure:
address: ':443'
http3: {}
http:
tls:
certResolver: cloudflare
domains:
- main: domain.de
sans:
- "*.domain.de"
- main: anderedomain.net
sans:
- "*.anderedomain.net"
Alles anzeigen
docker-compose.override.yml
networks:
proxy:
name: proxy
external: true
services:
certdumper:
image: ghcr.io/kereis/traefik-certs-dumper:latest
restart: unless-stopped
network_mode: none
command:
- --restart-containers
- mailcowdockerized-postfix-mailcow-1,mailcowdockerized-dovecot-mailcow-1
volumes:
- /opt/containers/traefik-crowdsec-stack/data/traefik/certs:/traefik:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./data/assets/ssl:/output:rw
- ./hook.sh:/hook/hook.sh:ro
environment:
DOMAIN: domain.de,anderedomain.net
ACME_FILE_PATH: "/traefik/acme.json"
healthcheck:
test: ["CMD", "/usr/bin/healthcheck"]
interval: 30s
timeout: 10s
retries: 5
nginx-mailcow:
ports: !reset
networks:
proxy:
labels:
traefik.enable: "true"
traefik.docker.network: proxy
traefik.http.services.nginx-mailcow.loadbalancer.server.port: "80"
traefik.http.routers.mail-secure.entrypoints: websecure
traefik.http.routers.mail-secure.middlewares: default@file
traefik.http.routers.mail-secure.rule: Host(`mail.domain.de`)
traefik.http.routers.mail-secure.service: nginx-mailcow
traefik.http.routers.domain-de-secure.entrypoints: websecure
traefik.http.routers.domain-de-secure.middlewares: default@file
traefik.http.routers.domain-de-secure.rule: Host(`autoconfig.domain.de`) || Host(`autodiscover.domain.de`) || Host(`mta-sts.domain.de`)
traefik.http.routers.domain-de-secure.service: nginx-mailcow
traefik.http.routers.domain-de-unsecure.entrypoints: web
traefik.http.routers.domain-de-unsecure.rule: Host(`autoconfig.domain.de`) || Host(`autodiscover.domain.de`) || Host(`mta-sts.domain.de`)
traefik.http.routers.anderedomain.net-net-secure.entrypoints: websecure
traefik.http.routers.anderedomain.net-net-secure.middlewares: default@file
traefik.http.routers.anderedomain.net-net-secure.rule: Host(`autoconfig.anderedomain.net`) || Host(`autodiscover.anderedomain.net`) || Host(`mta-sts.anderedomain.net`)
traefik.http.routers.anderedomain.net-net-secure.service: nginx-mailcow
traefik.http.routers.anderedomain.net-net-unsecure.entrypoints: web
traefik.http.routers.anderedomain.net-net-unsecure.rule: Host(`autoconfig.anderedomain.net`) || Host(`autodiscover.anderedomain.net`) || Host(`mta-sts.anderedomain.net.net`)
Alles anzeigen
hook.sh
#!/bin/bash
# Skript: hook.sh
QUELLORDNER1="/output/domain.de"
ZIELORDNER1_LISTE=(
"/output/mail.domain.de"
"/output/mta-sts.domain.de"
"/output"
)
QUELLORDNER2="/output/anderedomain.net"
ZIELORDNER2_LISTE=(
"/output/mta-sts.anderedomain.net"
)
kopiere_certificates() {
local QUELL="$1"
shift
local ZIELORDNER_LISTE=("$@")
if [[ ! -f "$QUELL/cert.pem" || ! -f "$QUELL/key.pem" ]]; then
echo "Fehler: cert.pem oder key.pem existieren nicht im Quellordner $QUELL"
return 1
fi
for ZIEL in "${ZIELORDNER_LISTE[@]}"; do
if [[ -d "$ZIEL" ]]; then
cp -f "$QUELL"/{cert.pem,key.pem} "$ZIEL"
echo "Zertifikate von $QUELL nach $ZIEL kopiert."
else
echo "Warnung: Zielordner $ZIEL existiert nicht, wird übersprungen."
fi
done
}
kopiere_certificates "$QUELLORDNER1" "${ZIELORDNER1_LISTE[@]}"
kopiere_certificates "$QUELLORDNER2" "${ZIELORDNER2_LISTE[@]}"
Alles anzeigen
Zertifikate in Dovecot und Postfix haben eigentlich auch nichts mit Traefik zu tun. Sofern die bei der Ausstellung nicht kombiniert sind werden die auch nicht kombiniert ausgeliefert.
Was Certdumper damit macht kann ich dir nicht beantworten. Ich würde aber eher beide Lösungen von außen mit Zertifikaten versorgen (acme.sh) als die aus Traefik raus zu wursten.
Voraussetzung für alles ist:
- Traefik für entsprechende Domains Wildcard-Zertifikate erstellen lassen, wenn erledigt, Traefik herunterfahren.
- Mailcow normal laut deren Seite installieren (mailcow.conf: HTTP_REDIRECT=y, ADDITIONAL_SAN=mta-sts.*, AUTODISCOVER_SAN=y, SKIP_LETS_ENCRYPT=n, ENABLE_SSL_SNI=y
- Mailcow installieren/starten
- Neue Domain "domain.de" und "anderedomain.net" anlegen, so das Mailcow sich über sein internes acme seine Zertifikate holt. Damit erstellt er auch in '/data/assets/ssl' die passenden ORDNER, welche wichtig sind damit später der 'certdumper' die Zertifikate von Traefik hineinkopieren kann.
- Wenn alles erfolgreich und Zertifikate wurden erstellt, dann Mailcow herunterfahren.
- Jetzt die passende 'docker-compose.override.yml' in das Root-Verzeichnis von Mailcow kopieren und entsprechend abändern.
- mailcow.conf öffnen, dann HTTP_REDIRECT=n, SKIP_LETS_ENCRYPT=y
- Traefik starten
- Mailcow starten (der Dumper holt sich nun die Zertifikate von Traefik und plaziert sie korrekt in die jeweiligen Verzeichnisse in '/data/assets/ssl' und startet automatisch die Postfix -und Dovecot-Container neu, womit dann die Zertifikate von Traefik geladen werden.
Achso: Wenn das Zertifikat abläuft, erkennt der 'Certdumper' es, übersetzt, kopiert...startet neu...'
UNBEDINGT ZUNÄCHST MIT STAGING-ZERTIFIKATEN TESTEN !!!!!!!!!!!
Zertifikate in Dovecot und Postfix haben eigentlich auch nichts mit Traefik zu tun. Sofern die bei der Ausstellung nicht kombiniert sind werden die auch nicht kombiniert ausgeliefert.
Was Certdumper damit macht kann ich dir nicht beantworten. Ich würde aber eher beide Lösungen von außen mit Zertifikaten versorgen (acme.sh) als die aus Traefik raus zu wursten.
Genau das wollte ich nicht. Alles soll in Docker geschehen.
Traefik bietet es an, Wildcard-Zertifikate zu erstellen.
Certdumper bietet es an, sie zu 'übersetzen', zu kopieren und die entsprechenden Container neu zu starten.
Bei mir klappt es perfekt.
Wenn es perfekt funktioniert, verstehe ich nicht wo die Frage nach den getrennten Zertifikaten her kommt ![]()
Sonst schau dir die Zertifikate an ob die korrekt ausgestellt wurden, dann sind in den Infos auch keine Hinweise auf die anderen Domains mit drin. Nicht das da einfach nur alte Zertifikate ausgeliefert werden und die veränderte Konfiguration ignoriert wird.
Wenn es perfekt funktioniert, verstehe ich nicht wo die Frage nach den getrennten Zertifikaten her kommt
Sonst schau dir die Zertifikate an ob die korrekt ausgestellt wurden, dann sind in den Infos auch keine Hinweise auf die anderen Domains mit drin.
Wenn Du ON-TOP nur Mailcow unter Docker mit aktivierten SNI OHNE Traefik installierst, dann sind die Zertifikate voneinander unabhängig.
Meine Installation ist aber MIT Traefik, daher der etwas grössere Aufwand um SNI über Traefik zu bewerkstelligen.
Möglicherweise reden wir aber auch aneinander vorbei.
Das ist gut möglich.
Nach der Dokumentation extrahiert Traefik die Hostnamen aus den Router Regeln und würde vermutlich über diese irgendwie eine Summe der benötigten Zertifikate anfordern. Mit der Konfiguration hingegen sollten die Zertifikate nur für bestimmte Hostnamen und Aliasse zusammen gelegt werden. Dann dürften da nach meinem Verständnis keine Kombinationen mehr raus kommen welche du nicht definiert hast.
Wenn Traefik dennoch andere Kombinationen verteilt stimmt die Dokumentation da nicht oder die Änderung an den "Regeln" wird nicht erkannt.
Das ist gut möglich.
Nach der Dokumentation extrahiert Traefik die Hostnamen aus den Router Regeln und würde vermutlich über diese irgendwie eine Summe der benötigten Zertifikate anfordern. Mit der Konfiguration hingegen sollten die Zertifikate nur für bestimmte Hostnamen und Aliasse zusammen gelegt werden. Dann dürften da nach meinem Verständnis keine Kombinationen mehr raus kommen welche du nicht definiert hast.
Das sind DNS-01 Wildcard-Zertifikate. Dazu braucht Traefik keine Router-Regeln um Hostnamen daraus zu extrahieren. Eher fragen die in den Router-Regeln eingetragenen Hostnamen (Sub-Domains) Traefik, wofür für welche Hostnamen Zertifikate da sind um sie dann bereitzustellen.
z.b.
"traefik.http.routers.domain-de-secure.rule: Host(`autoconfig.domain.de`) Host(`autodiscover.domain.de`) Host(`mta-sts.domain.de`)" ---> Anfrage an Traefik ---> Traefik antwortet ----> nimm *domain.de.
Traefik macht das automatisch.
Man sollte aber beachten, dass nicht automatisch Sub-Domains erstellt werden. Die sollten schon beim DNS-Provider eingetragen sein oder man gibt im Root der DNS-Einstellungen das berühmte '*' ein.
Ich kann da nur aus der Dokumentation zittieren:
Zitat(...) domains are automatically extracted from router rules (...)
Sollte mit der Konfiguration aber nicht mehr relevant sein weil Hostnamen verschiedener Zertifikate sich nicht kombinieren lassen.
Wenn ich so drüber nachdenke was du beschreibst klingt es fast so als würden Traefik die Wildcard Zertifikate nicht verwenden (gar nicht erst ausstellen?) und extra neue mit diversen Aliassen beziehen...
Ich kann da nur aus der Dokumentation zittieren:
Sollte mit der Konfiguration aber nicht mehr relevant sein weil Hostnamen verschiedener Zertifikate sich nicht kombinieren lassen.
Wenn ich so drüber nachdenke was du beschreibst klingt es fast so als würden Traefik die Wildcard Zertifikate nicht verwenden (gar nicht erst ausstellen?) und extra neue mit diversen Aliassen beziehen...
Sorry, du redest hier permanent von "SAN-Zertifikaten".
In diesen Thread geht es um "Wildcard-Zertifikate".
Sorry, du redest hier permanent von "SAN-Zertifikaten".
In diesen Thread geht es um "Wildcard-Zertifikate".
Selbes Prinzip bis auf das der Wildcard Platzhalter im Name und Alias steht. Sowas sollte auch nie wirklich als Multi Domain Variante bei raus kommen...
Traefik soll dir *.a.tld (+ a.tld) sowie *.b.tld (+ b.tld) als getrennte Zertifikate erzeugen. Wenn du eine Anfrage an Traefik sendest wird eines der beiden Zertifikate je nach deinem Host Matching ausgewählt und für die Verbindung verwendet.
Selbes Prinzip bis auf das der Wildcard Platzhalter im Name und Alias steht. Sowas sollte auch nie wirklich als Multi Domain Variante bei raus kommen...
Selbes Prinzip?
Das lass ich jetzt mal so stehen.
Wo vermutest du den einen Unterschied in der Funktionsweise eines Wildcard Zertifikats? Das du für die Ausstellung etwas mehr dein Eigentum beweisen musst ist dem Client und Server bei der Wahl und Validierung recht egal.
Unabhängig davon wie der Server das Zertifikat dynamisch oder statisch für deinen Host wählt, kommt nur das Zertifikat raus welches auch ausgestellt wurde.