使用Docker容器的SSL客户端证书?

时间:2017-10-25 03:53:49

标签: java tomcat ssl docker keystore

我是Docker的新手,并试图学习它。我在Windows 7上使用Docker Quickstart终端。 我有一个简单的要求,我在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服务。此Web服务使用HTTPS在远程主机上内部调用其他Web服务。 我有远程主机的证书。

我在互联网上尝试了几种方法,可以将这些证书导入或复制到不同的地点/博客上提到的不同位置,但是徒劳无功。每当我使用HTTPS从test.war调用外部Web服务时,它就会给我SSL握手错误。

我还有一个Java密钥库。我试图在我的Docker文件中使用Java并试图使用密钥库,但是再次,徒劳无功。

当我在直接安装在我的机器上的tomcat上使用相同的test.war时,它的工作非常好。

有人可以通过提供在此方案中导入/使用SSL证书/密钥库的步骤来帮助我。另外,如何导入多个证书?

3 个答案:

答案 0 :(得分:8)

您可以尝试将证书导入docker内的jvm trusted store。

  

我是远程主机的证书。

您可以使用这些证书,但事实上您并不需要它们,您只需要颁发证书的颁发机构的根证书。您可以从互联网上下载。

通常它们以pem格式提供,但您对jvm需要der

首先,您需要转换证书:

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

然后将其安装到jvm keystore:

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

此命令询问您是否确实要添加证书,您需要输入"是"。

所有这些都可以转化为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>

答案 1 :(得分:0)

For Java apps in RHEL/Centos images, you can use 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 :(得分:0)

  1. 1对于Docker位置,请使用classpath:/some/location/cerkey.jks来引用Docker实例。
  2. 在运行docker的主机位置使用file:/some/location/cerkey.jks

提示:server.ssl.key-store的值