Krausmueller.de

Dynamischer DNS Client für IPv6

Dynamisches DNS wird genutzt um den DNS Eintrag für einen Host dessen IP sich regelmäßig und häufig ändert zu aktualisieren. Dies ermöglicht z.B. das Bereitstellen von Diensten hinter einem (V)DSL-Anschluss unter einem gleich bleibenden Namen. Es gibt mehrere Anbieter die einen solchen Dienst anbieten. Ich nutze z.B. SPDyn. Die Aktualisierung des DNS-Eintrags kann durch einen Client wie z.B. ddclient oder auch direkt über eine Fritzbox erfolgen. Für IPv4 Hosts ist das Verfahren einfach, die IP ist immer die des Routers der dann bestimmte Ports an interne Hosts weiterleitet (Portforwarding). Da ich von meinem Provider einen Dual-Stack Anschluss erhalten habe, hatte ich in der Vergangenheit auch einen AAAA-Record für IPv6 bei SPDyn angelegt. Worauf ich allerdings nicht achtete: mein Provider vergibt bei jedem Neuverbinden ein anderes IPv6 Präfix. Dadurch ändert sich also auch jedes mal die IPv6-Adresse meines internen Hosts. Aufmerksam auf diese Problematik wurde ich durch einen Fehler beim Erneuern meines Let’s Encrypt Zertifikats (vgl. Artikel zu acme-tiny).

Wenn ein AAAA-Record vorhanden ist bevorzugt Let’s Encrypt seit kurzem diesen um die Domain zu verifizieren (API Announcements). Da mein vor langer Zeit angelegter AAAA-Record sich mittlerweile (schon oft) geändert hat, schlug das Erneuern des Zertifikats also fehl.

Parsing account key...
Parsing CSR...
Registering account...
Already registered!
Verifying domain.com...
Traceback (most recent call last):
  File "acme_tiny.py", line 199, in 
    main(sys.argv[1:])
  File "acme_tiny.py", line 195, in main
    signed_crt = get_crt(args.account_key, args.csr, args.acme_dir, log=LOGGER, CA=args.ca)
  File "acme_tiny.py", line 150, in get_crt
    domain, challenge_status))
ValueError: domain.com challenge did not pass: {u'status': u'invalid', u'validationRecord': [{u'addressesResolved': [u'217.251.47.207', u'2003:86:2455:9c00:d1:3ff:fe81:bd3f'], u'url': u'http://domain.com/.well-known/acme-challenge/PDUNtwiHq5dncDrvs4V2NE9nSR9vLF2WhnAbX1jQ7f0', u'hostname': u'domain.com', u'addressesTried': [], u'addressUsed': u'2003:86:2455:9c00:d1:3ff:fe81:b46f', u'port': u'80'}], u'keyAuthorization': u'PDUNtwiHq5dncDrvs4V2NE9nSR9vLF2WhnAbX1jQ7f0.YW7Ac9LxjjuWvWzD542ZzSKxcFKDIdehVVzAuYA0vHI', u'uri': u'https://acme-v01.api.letsencrypt.org/acme/challenge/-yjij3RP1r4YC_TkQrUemgjhfWI17pQZSjMZ8kr-Lps/1441804350', u'token': u'PDUNtwiHq5dncDrvs4V2NE9nSR9vLF2WhnAbX1jQ7f0', u'error': {u'status': 400, u'type': u'urn:acme:error:connection', u'detail': u'Fetching http://domain.com/.well-known/acme-challenge/PDUNtwiHq5dncDrvs4V2NE9nSR9vLF2WhnAbX1jQ7f0: Timeout'}, u'type': u'http-01'}

In der Fehlerausgabe ist bei addressUsed zu sehen, dass eine IPv6-Adresse zur Überprüfung verwendet wird. Da die Adresse falsch ist kommt es zu einem Timeout.

Um diesen Fehler zu beheben und in Zukunft auch per IPv6 auf meinen Host zu Hause zugreifen zu können muss nicht nur der A-Record für IPv4 sondern eben auch der AAAA-Record für IPv6 bei einer Änderung aktualisiert werden.

Weiterlesen →

Intermediate Zertifikat für acme-tiny

Wie im Artikel zu acme-tiny erwähnt muss ein eigenes Script zum regelmäßigen Erneuern der Let’s Encrypt Zertifikate erstellt werden. In diesem Script wird das passende Intermediate Zertifikat von Let’s Encrypt heruntergeladen, damit dem Besucher die vollständige Zertifizierungs-Kette übermittelt werden kann. Wird das Intermediate Zertifikat vom Webserver nicht ausgeliefert, fällt die Bewertung von SSL Labs auf “B” zurück.

Weiterlesen →

Alternativer Client für Let’s Encrypt

Wie schon im 1. Artikel zu Let’s Encrypt kurz erwähnt ist die Installation des Clients und die notwendige Umgebung unter ~/.local/ nicht ganz durchsichtig. Als Alternative habe ich den Client acme-tiny getestet. Voraussetzung für den Client ist lediglich Python und OpenSSL. Der Quellcode ist unter 200 Zeilen und somit noch einigermaßen leicht nachvollziehbar.

Als weiteren Vorteil kann man durch Subject Alternative Names auch ein Zertifikat erstellen, dass für mehrere Domains (die auf den gleichen Server und Webspace verweisen) gültig ist. So kann also z.B. ein für die Domains krausmueller.de und www.krausmueller.de gültiges Zertifikat ausgestellt werden. Die README enthält alle notwendigen Schritte, weshalb ich nur kurz auf die aus meiner Sicht wichtigsten Schritte gesondert eingehe.

Weiterlesen →

Nginx mit SSL und Let’s Encrypt absichern

Hinweis: Wenn man den Client und Pakete die für ihn benötigt werden nicht zusätzlich auf seinem Server installieren will kann man auch mit der Hilfe einer Webseite die einzelnen Schritte zur Ausstellung des Zertifikats manuell durchführen.

Seit dem 3. Dezember 2015 befindet sich Let’s Encrypt in der Public Beta. Das bedeutet man kann sich ohne vorherige Registrierung und Wartezeit ein kostenloses SSL Zertifikat für seine Domain erstellen. Für mein “Heimcloud” nutze ich einen [Cubietruck]() (ähnlich zum weitaus bekannteren Raspberry Pi) mit Nginx. Dieser Artikel zeigt wie ich Nginx mit einem SSL-Zertifikat von Let’s Encrypt eingerichtet habe.

Als erstes musss der Let’s Encrypt Client installiert werden. Dabei werden alle benötigten Debian-Pakete installiert:

hostname:~# git clone https://github.com/letsencrypt/letsencrypt
hostname:~# cd letsencrypt
hostname:~/letsencrypt# ./letsencrypt-auto

Weiterlesen →