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

lms*_*ant 2 websphere-liberty open-liberty

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

现在,我正在尝试打包与 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 的默认信任库(以可移植的方式)的最简单/最简单的方法是什么?

Ala*_*air 6

更新:2020 年 2 月 9 日:

从 Liberty 的 19.0.0.12 版本开始,您可以使用以下 xml 获得相同的效果:

<ssl id="defaultSSLConfig" trustDefaultCerts="true" />
Run Code Online (Sandbox Code Playgroud)

这是在默认服务器模板中设置的,因此默认情况下新服务器将具有此功能。以前的答案仍然有效。


上一个答案:

我昨天才这样做,我的建议是这样的配置:

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

<keyStore id="myTrustStore" location="${java.home}/lib/security/cacerts" password="changeit" />
Run Code Online (Sandbox Code Playgroud)

在我的情况下,我使用生成的自签名证书使用 https 入站到我的 Liberty 服务器(我正在进行开发测试),如果我设置 defaultKeyStore 指向 cacerts 入站 ssl 已损坏,因为它不包含我可以使用的服务器证书。相反,我只是更新了默认的 ssl 配置以使用 cacerts 作为信任库,并保持密钥库不变。

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