0

私のチームでは、JHipster (6.8.0) に基づくマイクロサービス スタックを OpenShift (4.2) にデプロイしようとしています。

現在、ゲートウェイが起動し、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 を生成して再デプロイしましたが、うまくいきませんでした。まだまったく同じ問題。

確かに明らかな何かが欠けていますが、指を置くことはできません。

4

3 に答える 3

0

@deduper と @Chanseok Oh の助けのおかげで、問題を解決できました。

一部の JHipster/Openshift ユーザーがここに足を踏み入れた場合の説明はほとんどありません。

まず、keytool コマンドを使用して、組織の証明書を/opt/java/openjdk/lib/security/cacertsにインポートしようとしました。そこで、src/main/jib フォルダーに tmp/cert サブフォルダーを作成し、その中に組織の証明書を入れて、src/main/jib/entrypoint.sh ファイルを次のように更新します。

#!/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"  "$@"

ローカルで動作しているように見えますが、Openshift で起動すると、 keytool が呼び出されたときにアクセス許可が拒否されました。これは、デフォルトで Openshift が root ユーザーを使用しないためです。そのため、最終的に変更を削除し、元の entrypoint.sh ファイルに戻ります。

私が使用した回避策は次のとおりです。

  • adaptopenjdk:11-jre-hotspotからcacertsファイルを抽出します (docker cp コマンドを使用、詳細: Docker コンテナーからホストへのファイルのコピー)
  • ワークステーションで keytool コマンドを使用してcacerts内に証明書を追加します
  • src/main/jib に次のサブフォルダーを作成します: opt/java/openjdk/lib/security
  • 内部にcacertsファイルをコピーします

jib を使用して Docker イメージを作成すると、opt/java/openjdk/lib/security 内のcacertsに組織の証明書が含まれており、Openshift で起動すると、Keycloak との通信は問題ありません。

于 2020-10-13T16:10:47.600 に答える