Openshift Spring Boot应用程序(JHipster)和KeyClope之间通过HTTPS的通信问题

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:找不到

在我的团队中,我们正试图在OpenShift(4.2)上部署一个基于JHipster(6.8.0)的微服务堆栈

目前,当网关启动并尝试通过HTTPS与Key斗篷通信时,我们遇到了一个问题(精确地说,在7.3版本中使用基于Key斗篷的Red Hat单点登录)

以下是引发的例外情况:

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/
上的任何内容

解决方案

  • 从浏览器中获取有问题的根CA证书(您称之为:“…网关试图连接的领域…”)

    • 按照您在问题中所说的方式提取(“X-509二进制编码DER文件…”)
  • 将证书添加到应用程序Docker映像所基于的JRE的
    cacerts
    密钥库中(
    采用OpenJDK:11 JRE热点

    • Dockerfile示例 让你知道你需要做什么:1
  • 来自OpenJDK:11 jre热点的
    
    复制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"  "$@"