我已将内部证书颁发机构导入 Java 的 CA 密钥库。(使用 keytool 导入“cacerts”存储)这工作正常,直到我更新 Java RPM。此时,所有导入的证书都不会转移到新安装。因此,应用程序在尝试建立 SSL 连接时会崩溃。
有没有办法让这些证书在 Java 升级过程中保持不变?或者有没有简单的方法可以在升级触发器上重新运行导入命令?我显然可以将这些命令编写到我的升级过程中,但我希望有一个更优雅的解决方案。
作为参考,这是 RHEL 5.10 的等效版本(技术上是 Oracle Linux)。我通过官方存储库使用 java-1.7.0-openjdk,刚刚升级到 U65。
答案1
将特定于站点或特定于主机的密钥库/信任库保留在 Java 安装目录之外可能会有所帮助,而在需要使用信任时指向它。假设您的信任库位于/opt/站点/cacerts.JKS,您可以通过以下两种方式之一进行操作:
在您的 Java 代码中,添加如下行:
System.setProperty("javax.net.ssl.trustStore","/opt/site/cacerts.JKS");
在运行时,向启动脚本添加定义:
java -D'javax.net.ssl.trustStore'="/opt/site/cacerts.JKS" /opt/site/myClass.class
答案2
我做的方式(可能不是最好的?):在升级之前保存 cacerts 并在之后恢复,我在更新脚本中编写了如下脚本:
1)保存:
javaexe=`readlink -f /usr/bin/java`
jredir=`dirname $javaexe`
cacertsfile=${jredir}/../lib/security/cacerts
[ -f $cacertsfile ] && cp -p $cacertsfile /tmp/cacerts
2)安装更新(yum update 或其他方式)。
3)恢复:
[ -f /tmp/cacerts ] && cp -p /tmp/cacerts $cacertsfile