图片由Waifu Diffusion v1.3 (float16) 生成——云海、异度之刃2、阿祖达、蓝天、巨树、逆戟鲸、1girl、红发、武士刀
NixOS 的优势之一是您可以使用 NixOS 模块来执行诸如覆盖软件包版本之类的操作,以便您可以自定义计算机上正在运行的软件。您可以使用它来手动修补程序,或者用其他版本覆盖依赖关系。今天我将向你展示如何使用覆盖来强制 NixOS 使用 OpenSSL 1.1.1 而不是 OpenSSL 3.x 重建nginx 。如果您想降低与针对 OpenSSL 3.x 宣布的 CRITICAL 安全问题相关的风险(OpenSSL 1.1.1 未列为 CRITICAL),您可能需要执行此操作。
< Cadey > 除非你运行 NixOS 不稳定或使用来自 NixOS 不稳定的 nginx 包,否则这不是必需的。如果您使用 NixOS 22.05,除非您以其他方式覆盖,否则您已经在使用 OpenSSL 1.1.1。
打开您的configuration.nix
文件并将其添加到模块块中:
nixpkgs.overlays = [ (final: prev: { nginxStable = prev.nginxStable.override { openssl = prev.openssl_1_1; }; }) ];
这将创建一个覆盖,将 nginx 包替换为 OpenSSL 替换为 OpenSSL 1.x 包的版本。
< Mara > 你需要在这里使用
nginxStable
而不是nginx
因为services.nginx.package
默认为nginxStable
。或者,您可以使用类似这样的方法直接更改 nginx 包: services.nginx.package = (pkgs.nginxStable.override { openssl = pkgs.openssl_1_1; });
根据事实和情况,这可能是理想的。它使用覆盖来更改传递到包构建中的 OpenSSL 版本。这是有效的,因为nixpkgs
中的包是这样定义的:
{ stdenv, openssl, fetchurl }: stdenv.mkDerivation { # whatever is needed to build the software }
顶行中的每个输入都是包的参数(它被建模为一个函数)。当您使用.override
时,您将覆盖传递给包函数的参数。这意味着当您使用我粘贴的覆盖时,您将覆盖传递给 nginx 构建过程的 OpenSSL 版本,这将使 nginx 依赖于 OpenSSL 1.x。
根据所讨论的软件,您应该能够使用此策略来修补任何其他面向公众的程序。唯一的问题是软件需要与 OpenSSL 1.x 兼容。
< Cadey > 您可能希望在 NixOS 不稳定升级到 OpenSSL 3.0.7 后立即删除它。
< Mara > 感谢 ckie 审查这篇文章的正确性!