Dienstag, 8. Februar 2022

HAProxy liefert Let'sEncrypt Challenge ohne zusätzlichen Webserver

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