如何在派生时访问CA证书

问题描述 投票:1回答:1

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

with import <nixpkgs> {
  config.allowUnfree = true;
  config.oraclejdk.accept_license = true;
};

let dependencies = rec {
  _oraclejdk8 = stdenv.lib.overrideDerivation pkgs.oraclejdk8 (attrs : {
    installPhase = ''
      ${attrs.installPhase}

      pems_dir=pems
      mkdir "$pems_dir"

      echo "split bundled ca-certificates into separate files 'cert.N.pem'\
                and add them to default keystore"

      keytool=$out/bin/keytool
      keystore=$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"} }' < /etc/ssl/certs/ca-bundle.crt

      # import certificates
      for f in `ls cert.*.pem`; do
        alias=`basename $f`
        $keytool -import -trustcacerts -noprompt -keystore "$keystore" -alias "$alias" -file "$f" -storepass changeit;
      done
      popd

    '';
  });

};
in with dependencies;
stdenv.mkDerivation rec {
  name = "env";
  buildInputs = [ _oraclejdk8 ];
}

但是现在它失败,并出现以下错误:

/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
1个回答
1
投票

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

但是,固定密​​码配置时要小心,因为更改密码时,您需要在各处进行更新。假设您要运行软件的2年旧版本,是否要使用2年旧的证书或来自环境的证书来运行它?

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

您的情况似乎正确的解决方案不是在沙箱中添加证书,而是返回一个脚本,该脚本将在有意义的情况下执行此操作。何时何地取决于您,但是请确保您从适当的来源获得这些证书。如果您可以假设始终使用足够最新的Nixpkgs进行部署,则可以这样做。否则,最好使用/etc中系统上已存在的那些。

© www.soinside.com 2019 - 2024. All rights reserved.