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