cuneiform: add patch for gcc 14 (#368870)
[NixPkgs.git] / nixos / tests / common / acme / server / default.nix
blobaaf6a8bd7348985f816fb9420537cd68e9c81c71
1 # The certificate for the ACME service is exported as:
3 #   config.test-support.acme.caCert
5 # This value can be used inside the configuration of other test nodes to inject
6 # the test certificate into security.pki.certificateFiles or into package
7 # overlays.
9 # Another value that's needed if you don't use a custom resolver (see below for
10 # notes on that) is to add the acme node as a nameserver to every node
11 # that needs to acquire certificates using ACME, because otherwise the API host
12 # for acme.test can't be resolved.
14 # A configuration example of a full node setup using this would be this:
16 # {
17 #   acme = import ./common/acme/server;
19 #   example = { nodes, ... }: {
20 #     networking.nameservers = [
21 #       nodes.acme.networking.primaryIPAddress
22 #     ];
23 #     security.pki.certificateFiles = [
24 #       nodes.acme.test-support.acme.caCert
25 #     ];
26 #   };
27 # }
29 # By default, this module runs a local resolver, generated using resolver.nix
30 # from the parent directory to automatically discover all zones in the network.
32 # If you do not want this and want to use your own resolver, you can just
33 # override networking.nameservers like this:
35 # {
36 #   acme = { nodes, lib, ... }: {
37 #     imports = [ ./common/acme/server ];
38 #     networking.nameservers = lib.mkForce [
39 #       nodes.myresolver.networking.primaryIPAddress
40 #     ];
41 #   };
43 #   myresolver = ...;
44 # }
46 # Keep in mind, that currently only _one_ resolver is supported, if you have
47 # more than one resolver in networking.nameservers only the first one will be
48 # used.
50 # Also make sure that whenever you use a resolver from a different test node
51 # that it has to be started _before_ the ACME service.
53   config,
54   pkgs,
55   lib,
56   ...
58 let
59   testCerts = import ./snakeoil-certs.nix;
60   domain = testCerts.domain;
62   pebbleConf.pebble = {
63     listenAddress = "0.0.0.0:443";
64     managementListenAddress = "0.0.0.0:15000";
65     # These certs and keys are used for the Web Front End (WFE)
66     certificate = testCerts.${domain}.cert;
67     privateKey = testCerts.${domain}.key;
68     httpPort = 80;
69     tlsPort = 443;
70     ocspResponderURL = "http://${domain}:4002";
71     strict = true;
72   };
74   pebbleConfFile = pkgs.writeText "pebble.conf" (builtins.toJSON pebbleConf);
78   imports = [ ../../resolver.nix ];
80   options.test-support.acme = {
81     caDomain = lib.mkOption {
82       type = lib.types.str;
83       readOnly = true;
84       default = domain;
85       description = ''
86         A domain name to use with the `nodes` attribute to
87         identify the CA server.
88       '';
89     };
90     caCert = lib.mkOption {
91       type = lib.types.path;
92       readOnly = true;
93       default = testCerts.ca.cert;
94       description = ''
95         A certificate file to use with the `nodes` attribute to
96         inject the test CA certificate used in the ACME server into
97         {option}`security.pki.certificateFiles`.
98       '';
99     };
100   };
102   config = {
103     test-support = {
104       resolver.enable =
105         let
106           isLocalResolver = config.networking.nameservers == [ "127.0.0.1" ];
107         in
108         lib.mkOverride 900 isLocalResolver;
109     };
111     # This has priority 140, because modules/testing/test-instrumentation.nix
112     # already overrides this with priority 150.
113     networking.nameservers = lib.mkOverride 140 [ "127.0.0.1" ];
114     networking.firewall.allowedTCPPorts = [
115       80
116       443
117       15000
118       4002
119     ];
121     networking.extraHosts = ''
122       127.0.0.1 ${domain}
123       ${config.networking.primaryIPAddress} ${domain}
124     '';
126     systemd.services = {
127       pebble = {
128         enable = true;
129         description = "Pebble ACME server";
130         wantedBy = [ "network.target" ];
131         environment = {
132           # We're not testing lego, we're just testing our configuration.
133           # No need to sleep.
134           PEBBLE_VA_NOSLEEP = "1";
135         };
137         serviceConfig = {
138           RuntimeDirectory = "pebble";
139           WorkingDirectory = "/run/pebble";
141           # Required to bind on privileged ports.
142           AmbientCapabilities = [ "CAP_NET_BIND_SERVICE" ];
144           ExecStart = "${pkgs.pebble}/bin/pebble -config ${pebbleConfFile}";
145         };
146       };
147     };
148   };