[此处部分解决: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-build
或nixos-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:...="