web-dev-qa-db-ja.com

DockerコンテナでTomcatにSSL証明書を追加する方法は?

私はDockerを初めて使い、それを学ぼうとしています。 Windows 7でDockerクイックスタートターミナルを使用しています。DockerコンテナーでTomcatを使用するという単純な要件があります。私のDockerFileは次のとおりです。

FROM Tomcat:8.0.47-jre7
RUN cd /usr/local/Tomcat/webapps
COPY test.war /usr/local/Tomcat/webapps/test.war

次に、単純なビルドを発行し、Dockerコンソールでコマンドを実行します。

test.warはJava web-service。このWebサービスは、HTTPSを使用してリモートホスト上の他のWebサービスを内部的に呼び出します。リモートホストの証明書を持っています。

さまざまなフォーラム/ブログで言及されているように、それらの証明書をさまざまな場所にインポートまたはコピーするために、インターネット上で利用可能ないくつかの方法を試しましたが、無駄でした。 HTTPSを使用してtest.warから外部Webサービスを呼び出すたびに、SSLハンドシェイクエラーが発生します。

また、Javaキーストア。DockerファイルでもJavaを使用し、キーストアを使用しようとしましたが、再び無駄になりました。

マシンに直接インストールされているTomcatで同じtest.warを使用すると、まったく問題なく動作します。

このシナリオでSSL証明書/キーストアをインポート/使用できるようにする手順を提供することで、誰かが私を助けることができますか?また、複数の証明書をインポートするにはどうすればよいですか?

7
Gagan Singh

Docker内のjvm信頼ストアに証明書をインポートしてみてください。

リモートホストの証明書を持っています。

これらの証明書は使用できますが、実際には必要ありません。証明書を発行した機関のルート証明書のみが必要です。インターネットからダウンロードできます。

通常、それらはpem形式で提供されますが、jvmにはderが必要です。

まず、証明書を変換する必要があります。

openssl x509 -in ca.pem -inform pem -out ca.der -outform der

次に、それをjvmキーストアにインストールします。

keytool -importcert -alias startssl -keystore \
    $Java_HOME/lib/security/cacerts -storepass changeit -file ca.der 

このコマンドは、本当に証明書を追加するかどうかを尋ねます。「yes」と入力してください。

およびDockerfile:にまとめて

FROM Tomcat:8.0.47-jre7

COPY ca.pem ca.pem

RUN openssl x509 -in ca.pem -inform pem -out ca.der -outform der

RUN echo yes | keytool -importcert -alias startssl -keystore \
    /docker-Java-home/jre/lib/security/cacerts -storepass changeit -file ca.der 

COPY test.war /usr/local/Tomcat/webapps/test.war

WORKDIR /usr/local/Tomcat/webapps

注:既にder形式の証明書を持っている場合、openssl呼び出しは必要ありません。証明書を直接コピーするだけです。

証明書が実際に適用されていることを確認するには、コンテナを実行して、sshに入れます

$ docker exec -it <CONTAINER-ID> bash

キーストアを確認します。

$ keytool -keystore "/docker-Java-home/jre/lib/security/cacerts" -storepass changeit -list | grep <NAME-OF-YOUR-CERT-AUTHORITY>
11
Sasha Shpota

Java RHEL/Centosイメージ内のアプリの場合、update-ca-trust を使用できます。これにより、信頼ストアを更新して、/etc/pki/ca-trust.pemファイルも直接受け入れます。

FROM ...

USER root
COPY yourcertificate.pem /etc/pki/ca-trust/source/anchors/yourcertificate.pem
RUN update-ca-trust

これにより/etc/pki/Java/cacertsが自動的に更新されるため、Javaは新しい証明書を信頼します。

または、証明書がWebサーバーでホストされている場合、ファイルをコピーする代わりにcurlを使用してダウンロードできます-たとえば、

RUN curl -k https://badssl.com/certs/ca-untrusted-root.crt -o /etc/pki/ca-trust/source/anchors/ca-untrusted-root.crt && \
    update-ca-trust
2
Tom Donohue
  1. 1 Dockerの場所の場合は、classpath:/some/location/cerkey.jksを使用して、Dockerインスタンスを参照します。
  2. Dockerが実行されているホストの場所の場合は、file:/some/location/cerkey.jksを使用します。

ヒント:server.ssl.key-storeの値

0