Certbot mit SANs?

CyborgBeta

Captain
Registriert
Jan. 2021
Beiträge
3.410
Hi,

Bash:
# Requires access to port 80 from the internet, adjust your firewall if needed.
docker run --rm -it \
  -v "${PWD}/docker-data/certbot/certs/:/etc/letsencrypt/" \
  -v "${PWD}/docker-data/certbot/logs/:/var/log/letsencrypt/" \
  -p 80:80 \
  certbot/certbot certonly --standalone -d sub.example.com

kann ich hier erreichen, dass er "example.com" signiert (mit Lets Encrypt) UND "sub.example.com" als SAN einträgt, also beide signiert?

Hintergrund: Ich habe einen Dienst, der sowohl "example.com" wie auch "sub.example.com" für sich beansprucht, und es in den Clients andernfalls zu einem "Cerfiticate mismatch error" kommt.

Ich bin mir fast sicher, dass das geht ... ein Wildcard-Cert möchte ich aber nicht.
 
mit der Option "-d" machst du genau das. Du musst hier dann alle deine Domains angeben, welche in dem Zertifikat enthalten sein sollen. Also bei dir ein -d "example.com" und -d "sub.example.com":

Bash:
certbot -n certonly -d www.example.com -d example.com -d beta.example.com -d my.example.com

(PS: Traefik und Nginx-Proxy-Manager machen das automatisch für dich ;))
 
  • Gefällt mir
Reaktionen: madmax2010, Mojo1987, Der Lord und 3 andere
Danke sehr! :)
Ergänzung ()

blablub1212 schrieb:
Traefik und Nginx-Proxy-Manager machen das automatisch für dich

Wie ginge das mit Traefik?

JSON:
services:
  traefik:
    image: traefik:latest
    container_name: "traefik"
    stop_grace_period: 1m
    command:
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.websecure.address=:443"
      - "--certificatesresolvers.myresolver.acme.tlschallenge=true"
      - "--certificatesresolvers.myresolver.acme.email=..."
      - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
    labels:
      - "traefik.enable=true"
    ports:
      - 8080:8080
      - 443:443
    volumes:
      - "./letsencrypt:/letsencrypt"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
  #... andere Services
  website-mail:
    image: httpd:2.4
    labels:
      - "traefik.enable=true"
      - "traefik.http.services.website-mail.loadbalancer.server.port=80"
      - "traefik.http.routers.website-mail.rule=Host(`...`) || Host(`sub...`)"
      - "traefik.http.routers.website-mail.entrypoints=websecure"
      - "traefik.http.routers.website-mail.tls.certresolver=myresolver"
    profiles:
      - donotstart-mail

Bisher mache ich folgende: Ich stoppe den Mailserver, danach starte ich einmal den "website-mail"-Service, danach stoppe ich alles wieder und starte den Mailserver wieder ... sehr umständlich.

Hintergrund: Afaik, braucht Traefik einen aktiven Dienst, für den er ein Cert erstellen kann.
 
Zuletzt bearbeitet:
Das ist nicht ganz korrekt. Die HTTP-Challenge funktioniert nur über Port 80, die TLS-Challenge funktioniert nur über Port 443. Beides bei Mail natürlich nicht gegeben. Daher brauchst du hier die DNS-Challenge. Ob du das nutzen kannst, hängt aber stark von deinem Domain-Anbieter ab (im Zweifel kann die Domain über CloudFlare verwaltet werden, da gibts die DNS-Challenge).

https://doc.traefik.io/traefik/user-guides/docker-compose/acme-dns/
 
blablub1212 schrieb:
Das ist nicht ganz korrekt.
Doch, funktioniert.

blablub1212 schrieb:
Beides bei Mail natürlich nicht gegeben.
Doch, der Mail-Service braucht Port 80 und 443 nicht (und wird auch nicht von Traefik verwaltet).

blablub1212 schrieb:
(im Zweifel kann die Domain über CloudFlare verwaltet werden, da gibts die DNS-Challenge)
Danke fürs Angebot, aber nein.

blablub1212 schrieb:
Da wird leider nicht beschrieben, wie die Challange auch ohne Service funktioniert ...
Ergänzung ()

Edit: Ach, ich hab wieder zu kompliziert gedacht ... mit: `Host(example.com) || Host(sub.example.com)` funktioniert bereits alles, wie es soll:

1725705593835.png
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: madmax2010
Ok ich dachte du lässt den Mail-Server auch über Traefik laufen. Wenn hier der Grund ist, dass dein Mail-Server nicht über Docker läuft, dann kannst du natürlich neben dem Docker Provider "--providers.docker=true" auch zusätzlich den File Provider aktivieren:

Code:
- --providers.file.directory=/dynamic
- --providers.file.watch=true

Damit kannst du Services auch per Datei erzeugen: https://tech.aufomm.com/understand-file-provider-in-traefik-2/

Das ist analog zu den Labels aus deinem Compose-File:

Code:
    labels:
      - "traefik.enable=true"
      - "traefik.http.services.website-mail.loadbalancer.server.port=80"
      - "traefik.http.routers.website-mail.rule=Host(`...`) || Host(`sub...`)"
      - "traefik.http.routers.website-mail.entrypoints=websecure"
      - "traefik.http.routers.website-mail.tls.certresolver=myresolver"

Sobald der Dienst dann über Traefik aufgerufen wird, wird auch das Zertifikat abgeholt oder erneuert.

Sollte dein Domain-Anbieter die DNS-Challenge unterstützen, dann kannst du natürlich alternativ auch einen Cronjob für Certbot einrichten.
 
  • Gefällt mir
Reaktionen: CyborgBeta
blablub1212 schrieb:
Ok ich dachte du lässt den Mail-Server auch über Traefik laufen.
Ja. Ich nutze https://docker-mailserver.github.io/docker-mailserver/latest/ und - "traefik.enable=false" ist eingetragen (also, Traefik verwaltet den Mailserver nicht ... das ginge nicht) und die benötigten Ports sind geöffnet.

Habe alles in einer docker-compose.yml stehen. Ich wollte jetzt aber nicht die komplette Konfiguration von meinem Mailserver zeigen. ;)
 

Ähnliche Themen

D
Antworten
17
Aufrufe
2.367
DerLeon33
D
T
Antworten
16
Aufrufe
3.496
T
Zurück
Oben