Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nix 如何在构建派生时访问CA证书_Nix - Fatal编程技术网

Nix 如何在构建派生时访问CA证书

Nix 如何在构建派生时访问CA证书,nix,Nix,我想在运行nixshell时自动将CA证书添加到Java密钥库。在以下脚本工作之前: 带有导入的{ config.allowUnfree=true; config.oraclejdk.accept_license=true; }; let dependencies=rec{ _oraclejdk8=stdenv.lib.overrideDerivation pkgs.oraclejdk8(属性:{ 安装阶段=“” ${attrs.installPhase} pems_dir=pems mkdir

我想在运行
nixshell
时自动将CA证书添加到Java密钥库。在以下脚本工作之前:

带有导入的
{
config.allowUnfree=true;
config.oraclejdk.accept_license=true;
};
let dependencies=rec{
_oraclejdk8=stdenv.lib.overrideDerivation pkgs.oraclejdk8(属性:{
安装阶段=“”
${attrs.installPhase}
pems_dir=pems
mkdir“$pems_dir”
echo“将捆绑的ca证书拆分为单独的文件'cert.N.pem'\
并将它们添加到默认密钥库“
keytool=$out/bin/keytool
密钥库=$jrePath/lib/security/cacerts
pushd“$pems_dir”
awk'BEGIN{c=0;doPrint=0;}/END-CERT/{print>“CERT.c”.pem;doPrint=0;}/BEGIN-CERT/{c++;doPrint=1;}{if(doPrint==1){print>“CERT.c.pem”}
但现在它失败了,出现以下错误:

/nix/store/9fx2jfmks2zhvv2kmqgl6rg0fbkc3da0-stdenv-linux/setup: line 1391: /etc/ssl/certs/ca-bundle.crt: No such file or directory
看起来现在不可能访问任何现有文件。但实际上,此文件只是指向存储的链接:

$ readlink -f /etc/ssl/certs/ca-bundle.crt
/nix/store/w3vw4q9z7s0wig6ng4nv62af1917ynrm-ca-certificates.crt

如何在脚本中访问此文件?

Nix是一个封闭的构建系统,这意味着必须声明所有输入,以便跟踪它们。 您可以拉入Nixpkgs的证书颁发机构证书集,即
pkgs.cacert

  # CAREFUL, read on!
  awk 'BEGIN {c=0;doPrint=0;} /END CERT/ {print > "cert." c ".pem";doPrint=0;} /BEGIN CERT/{c++;doPrint=1;} { if(doPrint == 1) {print > "cert." c ".pem"} }' < ${cacert}/etc/ssl/certs/ca-bundle.crt
#小心,继续读!
awk'BEGIN{c=0;doPrint=0;}/END-CERT/{print>“CERT.c”.pem;doPrint=0;}/BEGIN-CERT/{c++;doPrint=1;}{if(doPrint==1){print>“CERT.c.pem”}<${cacert}/etc ssl/certs/ca-bundle.crt
但是,在固定加密配置时要小心,因为当它发生更改时,您需要到处更新它。假设您想要运行一个2年前版本的软件,您想要使用2年前的证书还是来自环境的证书来运行它

另一个问题是这些证书应该写入到哪里?默认情况下,Keytool写入主目录,这是构建沙箱中不存在的主目录


在您的情况下,似乎正确的解决方案不是在沙箱中添加证书,而是返回一个脚本,该脚本将在有意义的上下文中执行此操作。何时何地由您决定,但请确保您从良好的来源获得这些证书。如果您可以假设您的部署总是使用足够最新的NIXPKG完成的,那么您就可以这样做。否则,您可能会更好地使用系统中已有的
/etc

谢谢您的回答!实际上,目标是从当前配置(
/etc
)获取证书,因为它包含一些用于中间代理中的out-man的附加证书。这意味着,
pkgs.cacert
帮不上忙。我想知道是否可以从我的脚本访问当前的NixOS配置?如果您想在派生中不可变地执行此操作,可以将您的mitm证书连接到
pkgs.cacert
中的文件。如果要从评估主机获取它,请使用
${/etc/ssl/certs/ca bundle.crt}
。如果您想在运行时执行此操作,请使用
pkgs.writeScript
或可能的
shellHook
。我已经尝试过此
${/etc/ssl/certs/ca bundle.crt}
-它被扩展为存储中的路径,但问题是,该路径实际上是另一个符号链接,指向
/etc/ssl/certs/ca bundle.crt,而它又指向存储中的正确派生。但由于执行脚本时无法访问
/etc
,因此这种方法不起作用。看起来我需要手动添加对正确派生的依赖,但我不知道如何添加。你能给点建议吗?你可以试试
builtins.toFile“ca bundle.crt”(builtins.readFile/etc/ssl/certs/ca bundle.crt)
。但我真的怀疑这是一种可维护的方法。这应该是你自己的一个快速攻击,还是会被部署?我同意,这看起来不是一个好方法。但一般来说,为什么在构建派生时不能从主机配置中获取某些内容。我花了一些时间将ca证书添加到NixOS配置中,我不想花更多时间将其添加到我使用的每个java应用程序中。在我看来,应该有一些自然的方式来通过构建在主机配置之上的派生来继承主机配置。但我可能不明白尼克斯背后的一些基本想法:)