在我的团队中,我们正在尝试在 OpenShift (4.2) 上部署基于 JHipster (6.8.0) 的微服务堆栈。
我们目前在网关启动并尝试通过 HTTPS 与 Keycloak 通信时遇到问题(准确地说,使用基于 Keycloak 的 Red Hat Single Sign On 7.3)。
这是引发的异常:
javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
我们认为这是因为我们的网关不信任来自 Keycloak 的证书。确实,这是使用组织证书。我们已经登录到网关尝试连接的领域的 Keycloak 管理界面。我们已将证书提取为 X.509 二进制编码的 DER 文件;感谢 Chrome 浏览器功能。
我们首先尝试简单地将这些证书添加到etc/ssl/certs/java/cacerts
网关容器的文件夹中。为此,我们在项目 jib 存储库中创建了这些文件夹src/main/jib/etc/ssl/certs/java/cacerts
,并将证书复制到其中。
我们已经使用 Maven 和jib:dockerBuild
选项生成了网关 Docker 映像。我们将它推送到我们的 Docker 注册表并将其部署到 OpenShift。检查 OpenShift pod 后,证书已在etc/ssl/certs/java/cacerts
. 但是我们仍然得到与以前相同的错误。
然后我们尝试使用信任库。因此,我们使用以下命令为每个证书创建了一个:
keytool -import -file path/to/certificate.cer -alias certificateAlias -keystore applicationTrustStore.jks
由于以下命令,我们检查了所有证书是否已正确添加:
keytool -list -v -keystore applicationTrustStore.jks
然后我们将此 applicationTrustStore.jks 文件添加到 src/main/jib/etc/ssl/certs/java/cacerts
我们项目的文件夹中,并将其添加到 pom.xml 中:
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>${jib-maven-plugin.version}</version>
<configuration>
<from>
<image>adoptopenjdk:11-jre-hotspot</image>
</from>
<to>
<image>application:latest</image>
</to>
<container>
…
<jvmFlags>
<jvmFlag>-Djavax.net.ssl.trustStore=etc/ssl/certs/java/cacerts/applicationTrustStore.jks</jvmFlag>
<jvmFlag>-Djavax.net.ssl.trustStoreType=jks</jvmFlag>
<jvmFlag>-Djavax.net.ssl.trustStorePassword=password</jvmFlag>
</jvmFlags>
</container>
…
</configuration>
</plugin>
再一次,我们生成并重新部署到 OpenShift,但没有成功;仍然是完全相同的问题。
我们当然遗漏了一些明显的东西,但我们不能指望它。