Java Webアプリケーションは、通常のデプロイメントモデル(サーバーへのインストール)からOpenShift環境(Dockerコンテナーとしてのデプロイメント)に移動することになっています。現在、このアプリケーションは、 JavaサードパーティのWebインターフェースと通信するためのクライアント証明書のキーストア(.jksファイル)。インターフェースごとに1つのキーストアがあります。
これらのjksファイルは、運用マシンに手動でデプロイされ、サードパーティの証明書を更新する必要がある場合に時々更新されます。私たちのアプリケーションには、キーストアファイルへのパスが設定されており、起動時にそれらから証明書を読み取り、それらを使用してサードパーティのシステムと通信します。
OpenShiftデプロイメントに移行すると、すべての環境(開発、テスト、本番)で使用されるアプリケーションを含む1つのDockerイメージがあります。すべての設定は環境変数として与えられます。ただし、環境変数としてjksファイルを指定することはできません。これらは、Dockerコンテナーのファイルシステムにマウントする必要があります。
これらの証明書は秘密であるため、イメージに焼き付けたくありません。私はOpenShiftのドキュメントをスキャンして、これにアプローチする方法についての手がかりをいくつか探し、基本的に2つのオプションを見つけました:シークレットを使用するか、永続的なボリュームの要求(PVC)をマウントします。
シークレットは、ファイルとしてマウントしたり、環境変数として渡したりできるキーと値のペアにすぎないため、機能しないようです。また、サイズ制限もあります。 PVCを使用することは理論的には機能しますが、最初にJKSファイルをそのボリュームに入れるための何らかの方法が必要です。単純な方法は、PVCをマウントしてシェルコンテナーを開始し、OpenShiftコマンドラインツールを使用して手動でファイルをコピーすることですが、私は少し手動の解決策を望んでいました。
この問題の巧妙な解決策、またはファイルをコンテナーに入れる必要がある同様の問題を見つけましたか?
秘密がどのように機能するかを誤解していることがわかりました。これらは確かにファイルとしてマウントできるキーと値のペアです。ただし、値は、ファイルのコンテンツとしてマップされる、base64でエンコードされたバイナリにすることができます。したがって、解決策は、まずJKSファイルのコンテンツをbase64にエンコードすることです。
cat keystore.jks| base64
次に、これを秘密の定義に含めることができます。
apiVersion: v1
kind: Secret
metadata:
name: my-secret
namespace: my-namespace
data:
keystore.jks: "<base 64 from previous command here>"
最後に、デプロイ構成で参照することにより、これをdockerコンテナーにマウントできます。
apiVersion: v1
kind: DeploymentConfig
spec:
...
template:
spec:
...
container:
- name: "my-container"
...
volumeMounts:
- name: secrets
mountPath: /mnt/secrets
readOnly: true
volumes:
- name: secrets
secret:
secretName: "my-secret"
items:
- key: keystore.jks
path: keystore.jks
これにより、シークレットボリュームsecrets
が/mnt/secrets
にマウントされ、keystore.jks
という名前のエントリがkeystore.jks
の下のファイル/mnt/secrets
として利用できるようになります。
これが本当に良い方法であるかどうかはわかりませんが、少なくともここでは機能しています。
JanThomäが述べたように、シークレットを追加してマウントすることができますが、ocコマンドラインツールを使用すると、次のように簡単になります。
./oc create secret generic crnews-keystore --from-file=keystore.jks=$HOME/git/crnews-service/src/main/resources/keystore.jks --from-file=truststore.jks=$HOME/git/crnews-service/src/main/resources/truststore.jks --type=opaque
これは、UIを介して追加できます。Applications-> Deployments->->「Add config files」で、マウントするシークレットを選択できます。
Name = valueのペア(truststore.jks =など)は、filename = base64decoded-Contentのように使用されることに注意してください。
@Frischlingと@Jan-Thomäの両方の発言に基づいて構築し、フリッシュリングとの合意により、キーストアをApplications->Deployments->[your deployments name]
環境リンクをクリックして、次のシステムプロパティを追加します。
名前: Java_OPTS_APPENDおよび
値-Djavax.net.ssl.keyStorePassword=changeme -Djavax.net.ssl.keyStore=/mnt/keystores/your_cert_key_store.jks -Djavax.net.ssl.trustStorePassword=changeme -Djavax.net.ssl.trustStore=/mnt/keystores/your_ca_key_store.jks
これにより、示されているように、キーストアファイルのパスとパスワードがJavaオプション(JBoss/WildFlyやTomcatなど)によって使用されるオプション)に追加されます。