cacerts
当您没有JAVA_HOME
或JRE_HOME
未定义时,我正在研究如何获取默认 java 安装的位置。
我需要一个至少适用于OS X
和的解决方案Linux
。
是的。java -v
假定工作:)
在Linux下,要查找的位置$JAVA_HOME
:
readlink -f /usr/bin/java | sed "s:bin/java::"
在cacerts
以下lib/security/cacerts
:
$(readlink -f /usr/bin/java | sed "s:bin/java::")lib/security/cacerts
在mac OS X下,查找$JAVA_HOME
运行:
/usr/libexec/java_home
在cacerts
以下Home/lib/security/cacerts
:
$(/usr/libexec/java_home)/lib/security/cacerts
更新(带有 JDK 的 OS X)
上面的代码是在没有安装 JDK 的计算机上测试的。正如 pR0Ps 所说,安装 JDK后,它位于
$(/usr/libexec/java_home)/jre/lib/security/cacerts
从 OS X 10.10.1 (Yosemite) 开始,cacerts
文件的位置已更改为
$(/usr/libexec/java_home)/jre/lib/security/cacerts
如果您需要以编程方式访问这些证书,最好根本不使用该文件,而是通过信任管理器访问它。以下代码来自 OpenJDK测试用例(确保构建的 cacerts 集合不为空):
TrustManagerFactory trustManagerFactory =
TrustManagerFactory.getInstance("PKIX");
trustManagerFactory.init((KeyStore) null);
TrustManager[] trustManagers =
trustManagerFactory.getTrustManagers();
X509TrustManager trustManager =
(X509TrustManager) trustManagers[0];
X509Certificate[] acceptedIssuers =
trustManager.getAcceptedIssuers();
因此,您不必处理文件位置或密钥库密码。
在 MacOS Mojave 中,位置是:
/Library/Java/JavaVirtualMachines/jdk1.8.0_192.jdk/Contents/Home/jre/lib/security/cacerts
如果使用 sdkman 管理 java 版本,cacerts 在
~/.sdkman/candidates/java/current/jre/lib/security
在 High Sierra,cacerts位于:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/security/cacerts
Java 9
以后,它在
${JAVA_HOME}/lib/security/cacerts
与通常的相反
${JAVA_HOME}/jre/lib/security/cacerts
也可以参考readlink -f " which java
"。但是,它可能不适用于所有二进制包装器。实际启动一个 Java 类很可能会更好。
在 Ubuntu 20.04.3 LTS 中,cacerts位于:/etc/ssl/certs/java/cacerts
$ java --version
openjdk 11.0.11 2021-04-20
OpenJDK Runtime Environment (build 11.0.11+9-Ubuntu-0ubuntu2.20.04)
OpenJDK 64-Bit Server VM (build 11.0.11+9-Ubuntu-0ubuntu2.20.04, mixed mode, sharing)
$ ls -lah /usr/lib/jvm/java-11-openjdk-amd64/lib/security/cacerts*
/usr/lib/jvm/java-11-openjdk-amd64/lib/security/cacerts -> /etc/ssl/certs/java/cacerts