使用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