使用默认 java 信任库(cacerts)打包自由应用程序的最佳方式

Best way to package liberty app with default java truststore (cacerts)

我正在打包一个使用 Db2 的 liberty 应用程序。当我们 运行 在本地时,我们配置证书以保护从应用程序到数据库的连接。

现在我正在尝试打包同一个应用程序以与 Db2 on Cloud 服务一起使用,但我在 SSL 配置方面遇到了问题。

我想我可以创建一个信任库并将 digicert 根 CA 添加到其中并将其与应用程序打包在一起,但我倾向于只使用 JDK 的内置 cacerts(因为我们也有限制性防火墙规则阻止与其他主机的出站连接。

我在 https://github.com/OpenLiberty/open-liberty/issues/4377 找到了非常相关的讨论,但我似乎无法找到一个很好的方法来以可移植的方式指定 JDK 的 cacert 存储的路径。

我试过如下设置: <keyStore id="defaultKeyStore" location="${env.JAVA_HOME}/jre/lib/security/cacerts"/>

但是由于某种原因它没有解析环境变量。为什么?

此外,这仅在 JAVA_HOME 设置为 JDK 时有效(就像在开发中一样)。在我们的容器中,我们没有那个,所以我们不希望路径中有 jre 部分。

告诉 Liberty 仅使用 JDK 的默认信任库(以可移植方式)的 simplest/easiest 方法是什么?

更新:2020 年 2 月 9 日:

从 19.0.0.12 版本的 Liberty 开始,您可以通过以下方式获得相同的效果 xml:

<ssl id="defaultSSLConfig" trustDefaultCerts="true" />

这是在默认服务器模板中设置的,因此新服务器默认会有。以前的答案仍然有效。


上一个回答:

我昨天刚刚做了这个,我的建议是这个配置:

<ssl id="defaultSSLConfig" trustStoreRef="myTrustStore"/>

<keyStore id="myTrustStore" location="${java.home}/lib/security/cacerts" password="changeit" />

在我的例子中,我使用 https 入站到我的 Liberty 服务器,使用生成的自签名证书(我正在做开发测试),如果我设置 defaultKeyStore 指向 cacerts 入站 ssl 被破坏,因为它不包含服务器我可以使用的证书。相反,我只是更新了默认的 ssl 配置,以将 cacerts 用作信任库,并将密钥库保持原样。

我使用 ${java.home} 因为它会一直存在(除非 Java 摆脱这个系统变量,但我怀疑情况不会总是如此)。 Liberty 的服务器脚本有多种计算 Java 位置的方法,因此它不需要 JAVA_HOME 作为环境变量。我猜你的情况 JAVA_HOME 没有设置为环境变量,但系统 属性 将永远存在。