summaryrefslogtreecommitdiffstats
path: root/tv/2configs/pki/default.nix
blob: 51a5c716fdb097ee3342710823bdc0acb8c325d7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
with import <stockholm/lib>;
{ config, pkgs, ... }: let

  certFile = config.environment.etc."ssl/certs/ca-certificates.crt".source;

in {

  environment.etc."pki/nssdb".source =
    pkgs.runCommand "system-wide-nssdb" {
      inherit certFile;
      buildInputs = [
        pkgs.jq
        pkgs.nssTools
      ];
      parseInfoScript = /* jq */ ''
        ${toJSON certFile} as $certFile |

        split("\t-----END CERTIFICATE-----\n")[] |
        select(test("\t-----BEGIN CERTIFICATE-----\n")) |
        . + "\t-----END CERTIFICATE-----\n" |

        sub("^([0-9]+\t\n)*";"") |

        (match("^([0-9]+)\t").captures[0].string | tonumber) as $lineNumber |

        gsub("(?m)^[0-9]+\t";"") |

        match("^([^\n]+)\n(.*)";"m").captures | map(.string) |

        # Line numbers are added to the names to ensure uniqueness.
        "\(.[0]) (\($certFile):\($lineNumber))" as $name |
        .[1] as $cert |

        { $name, $cert }
      '';
      passAsFile = [
        "parseInfoScript"
      ];
    } /* sh */ ''
      mkdir nssdb

      nl -ba -w1 "$certFile" |
      jq -ceRs -f "$parseInfoScriptPath" > certinfo.ndjson

      exec < certinfo.ndjson
      while read -r certinfo; do
        name=$(printf %s "$certinfo" | jq -er .name)
        cert=$(printf %s "$certinfo" | jq -er .cert)

        printf %s "$cert" | certutil -A -d nssdb -n "$name" -t C,C,C
      done

      mv nssdb "$out"
    '';

  environment.variables = flip genAttrs (_: toString certFile) [
    "CURL_CA_BUNDLE"
    "GIT_SSL_CAINFO"
    "SSL_CERT_FILE"
  ];

  security.pki.certificateFiles =
    mapAttrsToList
      (name: const (./certs + "/${name}"))
      (filterAttrs (const (eq "regular"))
                   (readDir ./certs));

}