如何在Docker容器中将SSL证书添加到Tomcat?

2022-09-02 21:12:41

我是 Docker 的新手,并试图学习它。我在 Windows 7 上使用 Docker Quickstart 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 控制台中发出简单的构建并运行命令。

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

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

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

当我在直接安装在我的机器上的tomcat上使用相同的test.war时,它绝对可以正常工作。

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


答案 1

您可以尝试将证书导入 docker 中的 jvm 可信存储区。

我有远程主机的证书。

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

通常它们以格式给出,但您需要jvm。pemder

首先,您需要转换证书:

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

注意:如果您已经拥有不需要调用的格式的证书,只需直接复制证书即可。deropenssl

若要验证证书是否真正应用,可以运行容器,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>

答案 2

对于 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

这将自动为您更新,以便 Java 信任新证书。/etc/pki/java/cacerts

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