本地 Nix 缓存被忽略,因为 NAR 信息文件缺少签名

And*_*rew 7 nixos nix

[此处部分解决: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-envasroot或作为“受信任的用户”并将这个“额外”的二进制缓存注册为“受信任的二进制缓存”;这不意味着我知道我在做什么,并且不需要系统唠叨丢失的签名吗?(无需完全禁用检查)我还没有找到如何仅为某个“受信任的”来源/用户禁用验证,并且几乎怀疑它不存在(即错误)。

  • 为了遵守这种签名机制,我可能还可以尝试设置一个“成熟的”二进制缓存,方法是使用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或者签名检查机制(或两者)只是损坏/未维护。因此,人们可以将其视为一个问题,而不是将其视为错误报告的候选者。但如果我错了 - 更好。

Gab*_*lez 9

以下是您如何配置服务器和客户端以使用通过nix-serve命令提供的签名二进制缓存。这不需要 usingnix-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
Run Code Online (Sandbox Code Playgroud)

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

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

nix-serve = {
  enable = true;
  secretKeyFile = "/path/to/nix-serve.sec";
};
Run Code Online (Sandbox Code Playgroud)

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

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

NIX_SECRET_KEY_FILE=/path/to/nix-serve.sec nix-serve ...
Run Code Online (Sandbox Code Playgroud)

客户端配置

如果您的客户端机器是一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:...="
];
Run Code Online (Sandbox Code Playgroud)

如果您不在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:...=
Run Code Online (Sandbox Code Playgroud)

如果您只想为一个构建启用二进制缓存,您可以将这些二进制缓存配置标志直接传递给任何 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:...="
Run Code Online (Sandbox Code Playgroud)