在 NixOS 中使用 keytool 向 jre cacert 添加证书
Adding a cert to jre cacert with keytool in NixOS
我正在尝试 运行 需要对外部服务进行 https 调用的 java 程序。但是我得到了错误
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
所以我尝试使用命令将证书添加到 cacert
keytool -import -alias MYALIAS -keystore /nix/store/10b0a6m8z23xw1ds0pmckmqfx1pvyjli-oraclejdk-8u161/jre/lib/security/cacerts -trustcacerts -file FILE-CA.crt
但我收到错误
keytool error: java.io.FileNotFoundException: /nix/store/10b0a6m8z23xw1ds0pmckmqfx1pvyjli-oraclejdk-8u161/jre/lib/security/cacerts (Read-only file system)
由于我的发行版是 NixOS,我知道在 /etc/nixos/configuration.nix 中可能有一种方法可以做到这一点,但是怎么做呢?
NixOS 目前没有专门的选项。您可以使用 NixOS Options Search 检查,或者为了更准确,使用 nixos-option
命令。
在我看来,证书应该是程序配置的一部分,而不是系统配置的一部分。您可以使用 keytool
的 -keystore
选项来指定主目录中的路径。然后,您可以使用
之类的方式将该密钥库传递给 JVM
java -Djavax.net.ssl.trustStore=$HOME/my/key/store -Djavax.net.ssl.trustStorePassword=mypassword
如果您的 java 程序带有某种包装器,您可能需要以不同的方式传递这些 java 'system properties',或者包装器可能会提供更简单的配置选项。
理想情况下,您可以打包程序使其成为 self-contained,但根据您问题中的信息很难判断这是否是一个好主意。
我正在尝试 运行 需要对外部服务进行 https 调用的 java 程序。但是我得到了错误
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
所以我尝试使用命令将证书添加到 cacert
keytool -import -alias MYALIAS -keystore /nix/store/10b0a6m8z23xw1ds0pmckmqfx1pvyjli-oraclejdk-8u161/jre/lib/security/cacerts -trustcacerts -file FILE-CA.crt
但我收到错误
keytool error: java.io.FileNotFoundException: /nix/store/10b0a6m8z23xw1ds0pmckmqfx1pvyjli-oraclejdk-8u161/jre/lib/security/cacerts (Read-only file system)
由于我的发行版是 NixOS,我知道在 /etc/nixos/configuration.nix 中可能有一种方法可以做到这一点,但是怎么做呢?
NixOS 目前没有专门的选项。您可以使用 NixOS Options Search 检查,或者为了更准确,使用 nixos-option
命令。
在我看来,证书应该是程序配置的一部分,而不是系统配置的一部分。您可以使用 keytool
的 -keystore
选项来指定主目录中的路径。然后,您可以使用
java -Djavax.net.ssl.trustStore=$HOME/my/key/store -Djavax.net.ssl.trustStorePassword=mypassword
如果您的 java 程序带有某种包装器,您可能需要以不同的方式传递这些 java 'system properties',或者包装器可能会提供更简单的配置选项。
理想情况下,您可以打包程序使其成为 self-contained,但根据您问题中的信息很难判断这是否是一个好主意。