[Anleitung] DANE/TLSA mit Letsencrypt

  • Hallo Leute,


    ich wollte heute mal eine kleine Anleitung dazu geben, wie Ihr DANE in Verbindung mit Letsencrypt verwenden könnt.
    Das ganze kann relativ kompliziert werden und die Anleitungen im Internet sind meist nicht vollständig zu gebrauchen oder auf Netcup anwendbar.


    Voraussetzungen für diese Anleitung:

    • Im CCP ist für die Domains DNSSEC aktiviert
    • Letsencrypt / Certbot eingerichtet
    • Zertifikate für eure Domains beantragt
    • E-Mail/SMTP Server mit STARTTLS und Zertifikat konfiguriert
    • Es wird die fullchain.pem verwendet


    Ihr braucht also ein vollständig laufendes System, indem nur noch DANE fehlt ;)
    Hinweis: Für SMTP ist es notwendig a) einen einzelnen MX Hostname für alle Domains zu verwenden oder b) ein sammel Zertifikat in dem alle Domains enthalten sind


    1. Schritt: Zertifikat Fingerprint
    Dazu empfehle ich das TLSAGEN Skript von sys4.de

    Code
    1. printf '_25._tcp.%s. IN TLSA 3 1 1 %s\n' \
    2. $(uname -n) \
    3. $(openssl x509 -in cert.pem -noout -pubkey |
    4. openssl pkey -pubin -outform DER |
    5. openssl dgst -sha256 -binary |
    6. hexdump -ve '/1 "%02x"')


    Dieses Skript speichern unter:
    /etc/letsencrypt/live/deinedomain.tld/
    Ausführbar machen und starten, der Output enthält nun den notwendigen Hash des aktuellen Letsencrypt Zertifikates.


    2. Schritt: Letsencrypt CA Fingerprint
    Wir benötigen nun noch den Hash von der Letsencrypt CA selbst, ich verwende "Let’s Encrypt Authority X3",
    in der Zukunft könnte sich dieses Zertifikat ändern.
    X1 und X2 sind mittlerweile veraltet, X4 dient derzeit dem worst-case Szenario als Backup.


    Chain of Trust - Let's Encrypt - Free SSL/TLS Certificates


    Wir downloaden also das X3 Zertifikat von Letsencrypt und generieren hiermit den Hash:

    Code
    1. openssl x509 -in lets-encrypt-x3-cross-signed.pem -noout -pubkey | openssl rsa -pubin -outform DER | openssl dgst -sha256 -hex | awk '{print "le-ca TLSA 2 1 1", $NF}'


    Damit haben wir den Hash des aktuellen Letsencrypt CA Zertifikates.


    3. Schritt: TLSA RR erstellen
    Im CCP könnt Ihr nun die RR für TLSA erstellen für jede Domain, die sollten wie folgt aussehen:

    Code
    1. Host Type Destination
    2. *._tcp TLSA 3 1 1 HASH_AUS_SCHRITT_1
    3. *._tcp TLSA 2 1 1 HASH_AUS_SCHRITT_2


    *._tcp sorgt dafür, dass dieser TLSA Eintrag für jeden Port gilt, Ihr könnt es bei bedarf auch nur auf SMTP beschränken durch _25._tcp


    4. Schritt: Validierung
    Sobald die Änderung übernommen wurden könnt Ihr hier prüfen ob alles funktioniert hat:
    DANE SMTP Validator


    5. Schritt: Zertifikat Erneuerung
    Wenn Ihr euer Zertifikat erneuert muss auch der TLSA RR aktualisiert werden.
    Dazu führt die Schritte 1-4 erneut aus.
    Schritt 2 kann übersprungen werden, wenn sich das Letsencrypt CA Zertifikat nicht geändert hat (sollte die nächsten Jahre so sein).


    Da der Certbot automatisch die Zertifikate erneuert und keine Info E-Mail versendet, kann es leider sein, dass man den Tag verpasst.
    Das ist jedoch nicht weiter schlimm aus folgendem Grund:


    Wir verwenden oben "3 1 1" und "2 1 1" Einträge, den Grund findet man hier:
    Please avoid "3 0 1" and "3 0 2" DANE TLSA records with LE certificates - Server - Let's Encrypt Community Support
    Durch das Pinnen der Letsencrypt CA haben wir eine Art "fallback", wenn unser Zertifikat erneuert wurde ist weiterhin der TLSA RR von der Letsencrypt CA gültig.
    Sollte Letsencrypt jedoch das "Let’s Encrypt Authority X3" Zertifikat ändern gilt dies nicht mehr!
    Daher sollte man es dennoch nicht vernachlässigen die TLSA RR zu aktualisieren ;)



    Damit endet nun meine Anleitung, ich hoffe sie ist soweit verständlich.


    Mit freundlichen Grüßen,
    MrKrabat