diff --git a/hosts/envoy/acme.nix b/hosts/envoy/acme.nix index c257605..200c858 100644 --- a/hosts/envoy/acme.nix +++ b/hosts/envoy/acme.nix @@ -16,7 +16,6 @@ in { security.acme = { acceptTerms = true; defaults = { - inherit (acme) email; credentialFiles = { CF_DNS_API_TOKEN_FILE = config.age.secrets.acme-cloudflare-dns-token.path; CF_ZONE_API_TOKEN_FILE = config.age.secrets.acme-cloudflare-zone-token.path; @@ -25,6 +24,6 @@ in { dnsPropagationCheck = true; reloadServices = ["nginx"]; }; - wildcardDomains = acme.domains; + inherit (acme) certs; }; } diff --git a/hosts/envoy/secrets/local.nix.age b/hosts/envoy/secrets/local.nix.age index e6ade60..fa32d3d 100644 Binary files a/hosts/envoy/secrets/local.nix.age and b/hosts/envoy/secrets/local.nix.age differ diff --git a/hosts/sentinel/acme.nix b/hosts/sentinel/acme.nix index c257605..200c858 100644 --- a/hosts/sentinel/acme.nix +++ b/hosts/sentinel/acme.nix @@ -16,7 +16,6 @@ in { security.acme = { acceptTerms = true; defaults = { - inherit (acme) email; credentialFiles = { CF_DNS_API_TOKEN_FILE = config.age.secrets.acme-cloudflare-dns-token.path; CF_ZONE_API_TOKEN_FILE = config.age.secrets.acme-cloudflare-zone-token.path; @@ -25,6 +24,6 @@ in { dnsPropagationCheck = true; reloadServices = ["nginx"]; }; - wildcardDomains = acme.domains; + inherit (acme) certs; }; } diff --git a/hosts/sentinel/secrets/local.nix.age b/hosts/sentinel/secrets/local.nix.age index e6ade60..b7a16d1 100644 --- a/hosts/sentinel/secrets/local.nix.age +++ b/hosts/sentinel/secrets/local.nix.age @@ -1,11 +1,11 @@ age-encryption.org/v1 --> X25519 Iz/ZYzOsB5ONZTT2azO8HcfvwEdS8zjYv2a+gdSa6Rw -3RvSD6jq4IKXOWmgFiLK0OgZkvrbRQZLqlYgiVMixAY --> piv-p256 xqSe8Q A4BW1CqEWMOdGkIjIqvXJrzC54BBaEbnhywgd1UA9gQf -lRdaSMaW/xFvzBYk56T6ld64vrFS4EbQdcJJarOd2hE --> Xw[-grease ^u-qoTf JV -7ht6GO0MH9xXNpmbVpi/NYiy27V0XHtE+qNmMqZSj0/rVtnYWMhm4Ezu+3Y ---- EYikW64z1mfwwVgFevfGeo4Sp4994H8WnvbJ+RfxMnc -PlbwqZޜ9 :Vl~(ރ#xV[|!ccVn%kYr;hS)ggELwZAJHj~a{*C8 -bi ! # K4/3$Ic7UTjfj`LX0fhO%~*]c񭯛RA0y0v#{C.BqW-1W7/jȔ} !/ Eb%Ԡtq!e>g)Λd~yA -ZN쟞mo|rX͈6T$~5͂Rj>zhKIed}NzZe`e݁b~K] h1yF \ No newline at end of file +-> X25519 AvHay53WfH+7CtbB9XWEkpcXVDqFUtNXmb3O9kkzt3Y +IucF4tsZgx7VsZ1jCuRbGOn/9m5ftvrJ9uBWs+F1XLE +-> piv-p256 xqSe8Q A0rh+U5E0cN7K7oR8TSipN/AyHBxNoohLrGHEIiQ0jWo +Qhi2dcShCBmodbO+QpxIwjjjMloe4NF9EQrXLecJt/w +-> wfDXBMR-grease & qyMg +UHgrFeFyejZpOlwsIQ1oviNwQVvNy+qrLfXc9LB5IiNE7MGn4Q +--- OvK6sw/WcdoBELlN6UvJmzSc8Hi/+0xMfq58lxTm3TQ +|1=_m6 a*kNќ_~x=< +eBG^X[Fq8Td^M{]>?.j0~Ut[e k t_8cJI*oK^bkqE[0IeAt@\? ϙuUl0 Jȉ 䍦׎υ74'Ƿ\ykO?IZg((&Ԅtmɯ]&qY/O\z{_DZpɑ>*r?>Ggvuy6lulB!1j:DfҍY̰:`7f>NmNl_?1kq'$*1/+P녚PSDDW*fP3 +c@}i˫e~-!W4 ~`]750 \ No newline at end of file diff --git a/modules/acme-wildcard.nix b/modules/acme-wildcard.nix index 47c158b..0aefecb 100644 --- a/modules/acme-wildcard.nix +++ b/modules/acme-wildcard.nix @@ -6,8 +6,9 @@ inherit (lib) assertMsg + attrNames filter - genAttrs + filterAttrs hasInfix head mkIf @@ -15,17 +16,19 @@ removeSuffix types ; + + wildcardDomains = attrNames (filterAttrs (_: v: v.wildcard) config.security.acme.certs); in { - options.security.acme.wildcardDomains = mkOption { - default = []; - example = ["example.org"]; - type = types.listOf types.str; - description = '' - All domains for which a wildcard certificate will be generated. - This will define the given `security.acme.certs` and set `extraDomainNames` correctly, - but does not fill any options such as credentials or dnsProvider. These have to be set - individually for each cert by the user or via `security.acme.defaults`. - ''; + options.security.acme.certs = mkOption { + type = types.attrsOf (types.submodule (submod: { + options.wildcard = mkOption { + default = false; + type = types.bool; + description = "If set to true, this will automatically append `*.` to `extraDomainNames`."; + }; + + config.extraDomainNames = mkIf submod.config.wildcard ["*.${submod.config._module.args.name}"]; + })); }; options.services.nginx.virtualHosts = mkOption { @@ -36,14 +39,13 @@ in { description = ''Automatically set useACMEHost with the correct wildcard domain for the virtualHosts's main domain.''; }; config = let - # This retrieves all matching wildcard certs that would include - # the corresponding domain. If no such domain is defined in - # security.acme.wildcardDomains, an assertion is triggered. + # This retrieves all matching wildcard certs that would include the corresponding domain. + # If no such domain is found then an assertion is triggered. domain = submod.config._module.args.name; matchingCerts = filter (x: !hasInfix "." (removeSuffix ".${x}" domain)) - config.security.acme.wildcardDomains; + wildcardDomains; in mkIf submod.config.useACMEWildcardHost { useACMEHost = assert assertMsg (matchingCerts != []) "No wildcard certificate was defined that matches ${domain}"; @@ -51,8 +53,4 @@ in { }; })); }; - - config.security.acme.certs = genAttrs config.security.acme.wildcardDomains (domain: { - extraDomainNames = ["*.${domain}"]; - }); }