Nixos

本地 Nix 記憶體被忽略,因為 NAR 資訊文件缺少簽名

  • September 15, 2016

[這裡部分解決: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或簽名檢查機制(或兩者)只是被破壞/未維護。因此,人們可以少將其視為一個問題,而將其視為一個錯誤報告候選者。但如果我錯了——那就更好了。

以下是如何配置伺服器和客戶端以使用通過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-buildor 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:...="

引用自:https://unix.stackexchange.com/questions/295947