私は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証明書/キーストアをインポート/使用できるようにする手順を提供することで、誰かが私を助けることができますか?また、複数の証明書をインポートするにはどうすればよいですか?
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>
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
classpath:/some/location/cerkey.jks
を使用して、Dockerインスタンスを参照します。file:/some/location/cerkey.jks
を使用します。ヒント:server.ssl.key-storeの値