本地 Nix 記憶體被忽略,因為 NAR 資訊文件缺少簽名
[這裡部分解決: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
asroot
或“受信任的使用者”並將這個“額外的”二進制記憶體註冊為“受信任的二進制記憶體”;這不是意味著我知道我在做什麼,並且不需要係統為失去簽名而嘮叨嗎?(無需完全禁用檢查)我還沒有找到如何僅為某個“受信任的”源/使用者禁用驗證,並且幾乎懷疑它不存在(即錯誤)。- 為了遵守這種簽名機制,我可能還可以嘗試設置一個“成熟的”二進制記憶體,方法是使用
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
或簽名檢查機制(或兩者)只是被破壞/未維護。因此,人們可以少將其視為一個問題,而將其視為一個錯誤報告候選者。但如果我錯了——那就更好了。
以下是如何配置伺服器和客戶端以使用通過
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
ornixos-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:...="