服务器配置

服务器配置

[此处部分解决:https://plus.google.com/110416349762686874861/posts/PVGHL1Tpeb9;但不完全]

我想使用我的一台 NixOS 机器作为软件包的缓存,这样就不会在每次升级时从 Hydra 中提取所有内容。所以我尝试这样做: https://nixos.org/nix/manual/#sec-sharing-packages。但

  • 当我尝试使用 时nix-serve -p <port>nix-env --option extra-binary-caches http://<host>:<port>/(即使运行为root!)只是忽略此缓存,说“NAR 信息文件”...“缺少签名”,并尝试切换到cache.nixos.org.所以nix-serve没有按预期工作。这是否意味着该文档不再真实,或者已nix-serve损坏?

  • 虽然nix-copy-closure --to <user>@<host>确实有效(如果<user>添加为受信任用户nix.trustedUsers)。但每次升级都这样做会非常不方便。顺便提一句。这里还让我困惑的是--from应该如何使用?

我对加密签名的工作原理以及为什么使用它们来签署包(和存储库)有大致的了解。但

  • 在这种情况下,我根本不需要它:无需担心 MITM 的风险。我只想定期轻松地将几 GiB 的二进制文件从一台计算机复制到另一台计算机。当然,我可以简单地通过完全禁用验证nix.requireSignedBinaryCaches = false,但是是否有一个不太激进的方法?比如说,如果我nix-env作为root或 作为“受信任的用户”调用,并将此“额外”二进制缓存注册为“受信任的二进制缓存”;这不是意味着我知道自己在做什么,并且不需要系统抱怨缺少签名吗? (不需要完全禁用检查)我还没有找到如何仅针对某个“受信任”源/用户禁用验证,并且几乎怀疑它不存在(即错误)。

  • 为了遵守此签名机制,我可能还可以尝试通过使用nix-store --generate-binary-cache-key、 thennix-push --dest <somewhere> --key-file <secret-1> --none <cherrypicked-paths>并在客户端上注册公钥来设置“成熟的”二进制缓存。但这不是我想要的:将档案存储在“服务器”上并nix-push显式设置路径。我只是希望要么nix-serve在交付前签署这些共享的包裹,以便接收方会很高兴,要么nix-env不要抱怨缺乏签名,如果我绝对确定这个特定的来源是值得信赖的!

结论:我很确定nix-serve签名检查机制(或两者)只是损坏/未维护。因此,人们可以将其视为一个错误报告候选者,而不是一个问题。但如果我错了——那就更好了。

答案1

以下是如何配置服务器和客户端以使用通过nix-serve命令提供的签名二进制缓存。这不需要使用nix-push生成缓存,您可以/nix/store直接使用此方法提供服务。

这已记录在man-page中nix-push,因此如果您想了解更多详细信息,也可以查看该内容

服务器配置

此示例假设您的服务器的主机名是cache.example.com

首先,您需要使用 生成签名密钥对nix-store --generate-binary-cache-key,如下所示:

$ nix-store --generate-binary-cache-key cache.example.com-1 nix-serve.sec nix-serve.pub

...只需替换cache.example.com为您的服务器的任何适当的主机名。它不必与真实的主机名匹配,但如果它们匹配就会有所帮助,以便您可以轻松地区分公钥属于哪个服务器。

如果您的缓存服务器正在运行NixOS,那么您可以通过将这两行添加到配置文件来提供缓存服务NixOS

nix-serve = {
  enable = true;
  secretKeyFile = "/path/to/nix-serve.sec";
};

...并确保用户nix-serve具有对该密钥的读取访问权限nix-serve.sec

如果您不使用NixOS并且想直接使用nix-serve可执行文件提供缓存服务,那么您需要使用NIX_SECRET_KEY_FILE环境变量来指定密钥的路径,如下所示:

NIX_SECRET_KEY_FILE=/path/to/nix-serve.sec nix-serve ...

客户端配置

如果您的客户端机器是一台NixOS机器,那么您可以将这些行添加到您的NixOS配置文件中:

nix.binaryCaches = [
  "https://cache.nixos.org/"

  # This assumes that you use the default `nix-serve` port of 5000
  "http://cache.example.com:5000"
];

nix.binaryCachePublicKeys = [
  "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="

  # Replace the following string with the contents of the
  # `nix-serve.pub` file you generated in the "Server configuration"
  # section above
  "cache.example.com-1:...="
];

如果您不在NixOS计算机上,则可以手动编辑nix.conf文件以进行以下设置:

binary-caches = https://cache.nixos.org/ http://cache.example.com
binary-cache-public-keys = cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY= cache.example.com-1:...=

如果您希望仅为一个构建启用二进制缓存,您可以将这些二进制缓存配置标志直接传递给任何 Nix 实用程序,例如nix-buildnixos-rebuild,如下所示:

nixos-rebuild build --option binary-caches "https://cache.nixos.org/ http://cache.example.com" --option binary-cache-public-keys "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY= cache.example.com-1:...="

相关内容