Leider bieten noch nicht alle Hoster eine DNS API, so dass für Let's Encrypt nur die http-01 Challenge in Frage kommt.
Ich nutze häufig HAProxy als Load-Balancer vor einem Setup mit verschiedenen Web-Server Containern. Um auf die Let's Encrypt Challenge Anfrage zu reagieren, bedarf es allerdings eines Web-Servers, der die URL /.well-known/acme-challenge/<Zufallszeichen> ausliefert.
Da die Zertifikate nur alle 2-3 Monate erneuert werden, ist das durchaus eine Aufgabe, die der HAProxy übernehmen könnte - auch wenn Content-Delivery definitiv nicht seine Aufgabe ist.
HAProxy lässt sich zu diesem Zweck per LUA erweitern. Folgende Einstellungen habe ich in der Config vorgenommen:
global chroot /var/lib/haproxy lua-load /etc/haproxy/lua/acme.lua ... frontend http-in acl letsencrypt path_beg -i /.well-known/acme-challenge http-request use-service lua.acme if letsencrypt ...
Das LUA Script acme.lua hat die Aufgabe die angeforderte Datei <Zufallszeichen> aus dem Verzeichnis /var/lib/haproxy/static auszuliefern, sofern sie existiert (HTTP Response 200). Andernfalls gibt es ein HTTP/404 zurück.
core.register_service("acme", "http", function(applet) local r = "/static/" local p = core.tokenize(applet.path, "/", true) local f = io.open( r .. p[3], "r") local s = 404 local res = "" if f ~= nil then s = 200 res = f:read("*all") applet:add_header("content-type", "text/plain") if(res ~= nil and res ~= "") then applet:add_header("content-length", string.len(res)) end f:close() end applet:set_status(s) applet:start_response() applet:send(res) end)
Nun muss nur noch dafür gesorgt werden, dass das Verzeichnis /var/lib/haproxy/static als Ablageort für die Let's Encrypt Challenge verwendet wird. In meinem dehydrated/acme Client sieht die Config dafür so aus:
WELLKNOWN=/var/lib/haproxy/static
Keine Kommentare:
Kommentar veröffentlichen