nixos/acme: Fix cert renewal with built in webserver

Fixes #191794

Lego threw a permission denied error binding to port 80.
AmbientCapabilities with CAP_NET_BIND_SERVICE was required.
Also added a test for this.

Changed files
+21 -1
nixos
modules
security
tests
+1
nixos/modules/security/acme/default.nix
···
'');
} // optionalAttrs (data.listenHTTP != null && toInt (elemAt (splitString ":" data.listenHTTP) 1) < 1024) {
CapabilityBoundingSet = [ "CAP_NET_BIND_SERVICE" ];
+
AmbientCapabilities = [ "CAP_NET_BIND_SERVICE" ];
};
# Working directory will be /tmp
+20 -1
nixos/tests/acme.nix
···
services.nginx.logError = "stderr info";
specialisation = {
+
# Tests HTTP-01 verification using Lego's built-in web server
+
http01lego.configuration = { ... }: {
+
security.acme = {
+
certs."http.example.test" = {
+
listenHTTP = ":80";
+
};
+
};
+
+
networking.firewall.allowedTCPPorts = [ 80 ];
+
};
+
# First derivation used to test general ACME features
general.configuration = { ... }: let
caDomain = nodes.acme.test-support.acme.caDomain;
···
download_ca_certs(client)
-
# Perform general tests first
+
# Perform http-01 w/ lego test first
+
switch_to(webserver, "http01lego")
+
+
with subtest("Can request certificate with Lego's built in web server"):
+
webserver.wait_for_unit("acme-finished-http.example.test.target")
+
check_fullchain(webserver, "http.example.test")
+
check_issuer(webserver, "http.example.test", "pebble")
+
+
# Perform general tests
switch_to(webserver, "general")
with subtest("Can request certificate with HTTP-01 challenge"):