Fuck domain-specific keys
This commit is contained in:
parent
e3e6305647
commit
7112e4722a
69
dkim.nix
69
dkim.nix
@ -1,41 +1,7 @@
|
|||||||
{ config, lib, pkgs, ... }:
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
with lib;
|
with lib;
|
||||||
let
|
let cfg = config.fudo.mail.dkim;
|
||||||
cfg = config.fudo.mail.dkim;
|
|
||||||
|
|
||||||
ensureDomainDkimCert = keyDir: domain:
|
|
||||||
let
|
|
||||||
dkimKey = "${keyDir}/${domain}.${cfg.selector}.key";
|
|
||||||
dkimTxt = "${keyDir}/${domain}.${cfg.selector}.txt";
|
|
||||||
in ''
|
|
||||||
if [ ! -f "${dkimKey}" ] || [ ! -f ${dkimTxt} ]; then
|
|
||||||
OUT=$(${pkgs.coreutils}/bin/mktemp -d -t dkim-XXXXXXXXXX)
|
|
||||||
opendkim-genkey \
|
|
||||||
--selector=${cfg.selector} \
|
|
||||||
--domain=${domain} \
|
|
||||||
--bits="${toString cfg.key-bits}" \
|
|
||||||
--directory=$OUT
|
|
||||||
mv $OUT/${cfg.selector}.private ${dkimKey}
|
|
||||||
mv $OUT/${cfg.selector}.txt ${dkimTxt}
|
|
||||||
fi
|
|
||||||
'';
|
|
||||||
|
|
||||||
ensureAllDkimCerts = keyDir: domains:
|
|
||||||
concatStringsSep "\n" (map (ensureDomainDkimCert keyDir) domains);
|
|
||||||
|
|
||||||
makeKeyTable = keyDir: domains:
|
|
||||||
pkgs.writeTextDir "key.table" (concatStrings (map (dom: ''
|
|
||||||
${dom} ${dom}:${cfg.selector}:${keyDir}/${dom}.${cfg.selector}.key
|
|
||||||
'') domains));
|
|
||||||
|
|
||||||
makeSigningTable = domains:
|
|
||||||
pkgs.writeTextDir "signing.table" (concatStrings (map (dom: ''
|
|
||||||
${dom} ${dom}
|
|
||||||
'') domains));
|
|
||||||
|
|
||||||
keyTableDir = makeKeyTable cfg.state-directory cfg.domains;
|
|
||||||
signingTableDir = makeSigningTable cfg.domains;
|
|
||||||
|
|
||||||
in {
|
in {
|
||||||
options.fudo.mail.dkim = with types; {
|
options.fudo.mail.dkim = with types; {
|
||||||
@ -55,19 +21,6 @@ in {
|
|||||||
default = "mail";
|
default = "mail";
|
||||||
};
|
};
|
||||||
|
|
||||||
key-bits = mkOption {
|
|
||||||
type = int;
|
|
||||||
description = ''
|
|
||||||
How many bits in generated DKIM keys. RFC6376 advises minimum 1024-bit keys.
|
|
||||||
|
|
||||||
If you have already deployed a key with a different number of bits than specified
|
|
||||||
here, then you should use a different selector (dkimSelector). In order to get
|
|
||||||
this package to generate a key with the new number of bits, you will either have to
|
|
||||||
change the selector or delete the old key file.
|
|
||||||
'';
|
|
||||||
default = 2048;
|
|
||||||
};
|
|
||||||
|
|
||||||
port = mkOption {
|
port = mkOption {
|
||||||
type = port;
|
type = port;
|
||||||
description = "Port at which to listen for incoming signing requests.";
|
description = "Port at which to listen for incoming signing requests.";
|
||||||
@ -100,28 +53,8 @@ in {
|
|||||||
in pkgs.writeText "opendkim.conf" ''
|
in pkgs.writeText "opendkim.conf" ''
|
||||||
Canonicalization relaxed/simple
|
Canonicalization relaxed/simple
|
||||||
Socket inet:${toString cfg.port}
|
Socket inet:${toString cfg.port}
|
||||||
# KeyTable file:${keyTableDir}/key.table
|
|
||||||
# SigningTable file:${signingTableDir}/signing.table
|
|
||||||
${optionalString cfg.debug debugString}
|
${optionalString cfg.debug debugString}
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
systemd = {
|
|
||||||
tmpfiles.rules = let
|
|
||||||
user = config.services.opendkim.user;
|
|
||||||
group = config.services.opendkim.group;
|
|
||||||
in [ "d ${cfg.state-directory} 0700 ${user} ${group} - -" ];
|
|
||||||
services.opendkim = {
|
|
||||||
path = with pkgs; [ opendkim ];
|
|
||||||
serviceConfig = {
|
|
||||||
# ExecStartPre = [
|
|
||||||
# (pkgs.writeShellScript "ensure-dkim-certs.sh"
|
|
||||||
# (ensureAllDkimCerts cfg.state-directory cfg.domains))
|
|
||||||
# ];
|
|
||||||
ReadWritePaths = [ cfg.state-directory ];
|
|
||||||
ReadOnlyPaths = [ keyTableDir signingTableDir ];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -459,7 +459,7 @@ in {
|
|||||||
dkim = {
|
dkim = {
|
||||||
service = {
|
service = {
|
||||||
networks = [ "internal_network" ];
|
networks = [ "internal_network" ];
|
||||||
volumes = [ "${cfg.state-directory}/dkim:/state" ];
|
volumes = [ "${cfg.state-directory}/dkim:/var/lib/opendkim" ];
|
||||||
};
|
};
|
||||||
nixos = {
|
nixos = {
|
||||||
useSystemd = true;
|
useSystemd = true;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user