如何在 nixos 中保留自签名证书?

Phi*_*ack 5 nixos

我有一个构建 virtualbox vm 的 nix 表达式。作为该过程的一部分,我通过以下方式安装了自签名 ssl 证书

certfile = builtins.readFile ./certificate.crt
security.pki.certificates = [ certfile ];
Run Code Online (Sandbox Code Playgroud)

这很好用。问题是如果我想运行 nixos-rebuild 来重新配置虚拟机。由于我不再可以从 vm 构建过程访问原始证书文件(因为我在 vm 中运行,而不是在我构建 vm 的机器上),我不能通过相同的机制再次包含该文件。

我想出了三个关于如何做到这一点的想法:

  1. 在 vm 构建过程中,在 vm 中的 /root 下放置一份额外的证书副本。然后我可以在我的 configuration.nix 中使用它再次拉入证书:

    security.pki.certificates = [ /root/cert ];
    
    Run Code Online (Sandbox Code Playgroud)
  2. 由于证书始终可用于从内部服务器进行 http 下载,因此每次执行 nixos-rebuild 时,我都可以在 configuration.nix 中使用 fetchUrl 以某种方式下载它。我想唯一的缺点是引入了外部依赖。

  3. 由于证书在 /etc/ssl/ca-certificates.crt 中,作为重建过程的一部分,我可以以某种方式从该文件中提取它,然后再次将其提供给 security.pki.certificates。

想法?

小智 2

您没有指定certfile第一行的内容。如果它是用 a 填充的变量builtins.readFile,您可以跳过该步骤并自行填充该变量。

$> nixos-option security.pki.certificates
Value:
[ "-----BEGIN CERTIFICATE-----
... edited for brevity .... " ]

Default:
[ ]

Example:
[ "NixOS.org\n=========\n-----BEGIN CERTIFICATE-----\nMIIGUDCCBTigAwIBAgIDD8KWMA0GCSqGSIb3DQEBBQUAMIGMMQswCQYDVQQGEwJJ\nTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0\n...\n-----END CERTIFICATE-----\n" ]

Description:

A list of trusted root certificates in PEM format.

Declared by:
  "/etc/nixos/nixpkgs/nixos/modules/security/ca.nix"

Defined by:
  "/etc/nixos/user.nix
Run Code Online (Sandbox Code Playgroud)

所以,设置security.pki.certificates [ "insert certificate here" ];将消除文件依赖性,然后配置是独立的。

否则,如果您希望将内容保留在配置之外,则需要为其创建打包/派生并将其添加到商店中。