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

我是Docker的新手,并试图学习它。 我在Windows 7上使用Docker快速入门terminal。我有一个简单的要求,我在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控制台中发出简单的构build和运行命令。

test.war是一个Java Web服务。 此Web服务使用HTTPS在内部调用远程主机上的其他Web服务。 我有远程主机的证书。

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

我也有一个Java密钥库。 我试图在我的Docker文件中使用Java,并尝试使用密钥库,但是又一次徒劳。

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

在这种情况下,有人可以通过提供能够导入/使用SSL证书/密钥库的步骤来帮助我。 另外,如何导入多个证书?

哟可以尝试导入证书到docker中的jvm信任存储。

我有远程主机的证书。

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

通常他们是以pem格式给出的,但是你需要der为jvm。

首先你需要转换证书:

 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 

这个命令询问你是否真的要添加证书,你应该input“yes”。

所有在一起它可以被转换Dockerfile这样的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调用,只需直接复制证书即可。

要validation证书是否真的被应用,你可以运行容器,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> 

对于RHEL / CentOS映像中的Java应用程序,您可以使用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将信任新的证书。

或者,如果您的证书托pipe在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