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

Gag*_*ngh 8 java ssl tomcat keystore docker

我是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
Run Code Online (Sandbox Code Playgroud)

然后我在Docker控制台中发出简单的构建和运行命令.

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

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

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

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

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

Sas*_*ota 12

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

我有远程主机的证书.

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

通常它们是以pem格式给出的,但你需要derjvm.

首先,您需要转换证书:

openssl x509 -in ca.pem -inform pem -out ca.der -outform der
Run Code Online (Sandbox Code Playgroud)

然后将其安装到jvm密钥库中:

keytool -importcert -alias startssl -keystore \
    $JAVA_HOME/lib/security/cacerts -storepass changeit -file ca.der 
Run Code Online (Sandbox Code Playgroud)

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

它们可以一起变成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
Run Code Online (Sandbox Code Playgroud)

注意:如果您已经拥有der格式的证书,则不需要openssl呼叫,只需直接复制证书即可.

要验证证书是否真正应用,您可以运行容器ssh到其中

$ docker exec -it <CONTAINER-ID> bash
Run Code Online (Sandbox Code Playgroud)

并检查密钥库:

$ keytool -keystore "/docker-java-home/jre/lib/security/cacerts" -storepass changeit -list | grep <NAME-OF-YOUR-CERT-AUTHORITY>
Run Code Online (Sandbox Code Playgroud)

  • 你不需要DER;`keytool`(更确切地说是 `CertificateFactory`)至少从 2008 年的 j6 开始就能够读取 PEM 证书,尽管带有无关文本的 PEM(如 OpenSSL 经常放置的“评论”经常放置)直到 2012 年的 j7。此外,您可以避免 FWIW `echo yes |` 和 `-noprompt` (2认同)

小智 5

对于 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
Run Code Online (Sandbox Code Playgroud)

这将/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
Run Code Online (Sandbox Code Playgroud)