Openshift Spring Boot应用程序(JHipster)和KeyClope之间通过HTTPS的通信问题
在我的团队中,我们正试图在OpenShift(4.2)上部署一个基于JHipster(6.8.0)的微服务堆栈 目前,当网关启动并尝试通过HTTPS与Key斗篷通信时,我们遇到了一个问题(精确地说,在7.3版本中使用基于Key斗篷的Red Hat单点登录) 以下是引发的例外情况:Openshift Spring Boot应用程序(JHipster)和KeyClope之间通过HTTPS的通信问题,openshift,jhipster,keycloak,jib,maven-jib,Openshift,Jhipster,Keycloak,Jib,Maven Jib,在我的团队中,我们正试图在OpenShift(4.2)上部署一个基于JHipster(6.8.0)的微服务堆栈 目前,当网关启动并尝试通过HTTPS与Key斗篷通信时,我们遇到了一个问题(精确地说,在7.3版本中使用基于Key斗篷的Red Hat单点登录) 以下是引发的例外情况: javax.net.ssl.SSLHandshakeException:PKIX路径生成失败:sun.security.provider.certpath.SunCertPathBuilderException:找不到
javax.net.ssl.SSLHandshakeException:PKIX路径生成失败:sun.security.provider.certpath.SunCertPathBuilderException:找不到请求目标的有效证书路径
我们认为这是因为我们的网关不信任来自KeyClope的证书。事实上,这是使用组织证书。
我们已登录到网关尝试连接的域上的KeyClope管理界面。我们将证书提取为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 applicationCustomStore.jks
由于以下命令,我们检查了所有证书是否已正确添加:
keytool-list-v-keystoreapplicationtruststore.jks
然后,我们将这个applicationCustomStore.jks文件添加到项目的src/main/jib/etc/ssl/certs/java/cacerts
文件夹中,并将其添加到pom.xml中:
com.google.cloud.tools
jib maven插件
${jib maven plugin.version}
采用OpenJDK:11 jre热点
应用:最新
…
-Djavax.net.ssl.trustStore=etc/ssl/certs/java/cacerts/applicationTrustStore.jks
-Djavax.net.ssl.trustStoreType=jks
-Djavax.net.ssl.trustStorePassword=密码
…
我们再次生成并重新部署到OpenShift,但运气不佳;还是一模一样的问题
我们确实错过了一些显而易见的东西,但我们不能对此指手画脚。TL;DR-尝试将证书添加到应用程序Docker映像所基于的JRE的cacerts
密钥库中
长篇大论的回答 啊,是的!旧的
…PKIX路径生成失败…
问题。我去过那里。在一个例子中,OpenShift也参与了引导
在这一点上,我可能遇到过十几次同样的错误,我敢打赌,您的努力到目前为止没有效果的原因是javax.net.ssl.SSLHandshakeException
来自运行您的应用程序的JRE;不是从/etc/ssl/certs/java/
上的任何内容
解决方案
- 按照您在问题中所说的方式提取(“X-509二进制编码DER文件…”)
cacerts
密钥库中(采用OpenJDK:11 JRE热点
)
- Dockerfile示例 让你知道你需要做什么:1
复制stackexchange.cer/tmp/cert/certificate.cer
运行keytool-noprompt-import-alias dedupper.answer-storepass changeit-keystore/opt/java/openjdk/lib/security/cacerts-file/tmp/cert/certificate.cer
CMD[“keytool”、“-list”、“-keystore”、“/opt/java/openjdk/lib/security/cacerts”、“-alias”、“dedupper.answer”、“-storepass”、“changeit”]
您可以从Docker Hub
$docker pull重复数据消除程序/ajrarn.soq.pkix.fix
运行它以观察是否添加了别名为的证书…2
$docker运行-it重复数据消除程序/ajrarn.soq.pkix.fix
警告:使用-cacerts选项访问cacerts密钥库
Duplicater.answer,2020年10月10日,trustedCertEntry,
证书指纹(SHA-256):E5:81:5A:DF:11:A9:0C:CC:51:8F:6A:99:D2:6C:67:16:29:D6:68:E1:EA:C2:C0:A7:E7:9B:84:09:AF:9C:29:14
如果即使这样也不能解决你的问题,那么我建议下一件事就是改变这个
…
-Djavax.net.ssl.trustStore=etc/ssl/certs/java/cacerts/applicationTrustStore.jks
…
对此
…
-Djavax.net.ssl.trustStore=/etc/ssl/certs/java/cacerts/applicationTrustStore.jks
…
如果您没有发现差异,您已经从:/etc/…
1您必须进行调整,无论您如何构建图像,以符合示例Dockerfile中的说明
2我在这个实验中使用了堆栈溢出证书。TL;DR-尝试将证书添加到应用程序Docker映像所基于的JRE的
cacerts
密钥库中
长篇大论的回答 啊,是的!旧的
…PKIX路径构建失败…
问题。出现了。OpenShift也参与了
# ls -l /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/security/cacerts
lrwxrwxrwx 1 root root 27 Jan 1 1970 /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/security/cacerts -> /etc/ssl/certs/java/cacerts
# ls -l /opt/java/openjdk/lib/security/cacerts
-rw-r--r-- 1 root root 101001 Jul 15 09:07 /opt/java/openjdk/lib/security/cacerts
#!/bin/sh
echo "The application will start in ${JHIPSTER_SLEEP}s..." && sleep ${JHIPSTER_SLEEP}
exec keytool -noprompt -import -alias alias -storepass changeit -keystore /opt/java/openjdk/lib/security/cacerts -file /tmp/cert/organization.cer
exec java ${JAVA_OPTS} -noverify -XX:+AlwaysPreTouch -Djava.security.egd=file:/dev/./urandom -cp /app/resources/:/app/classes/:/app/libs/* "com.your.company.App" "$@"