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

Java 如何在Docker容器中将SSL证书添加到Tomcat?,java,tomcat,ssl,docker,keystore,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控制台中发出简单的构建和运行命令 war是一个JavaWeb服

我对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控制台中发出简单的构建和运行命令

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

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

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

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


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

您可以尝试将证书导入docker内部的jvm可信存储

我有远程主机的证书

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

通常它们是以
pem
格式给出的,但是jvm需要
der

首先,您需要转换证书:

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 
$ keytool -keystore "/docker-java-home/jre/lib/security/cacerts" -storepass changeit -list | grep <NAME-OF-YOUR-CERT-AUTHORITY>
此命令询问您是否确实要添加证书,您应该键入“是”

并将其全部放在
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
$docker exec-it bash
并检查密钥库:

keytool -importcert -alias startssl -keystore \
    $JAVA_HOME/lib/security/cacerts -storepass changeit -file ca.der 
$ keytool -keystore "/docker-java-home/jre/lib/security/cacerts" -storepass changeit -list | grep <NAME-OF-YOUR-CERT-AUTHORITY>
$keytool-keystore”/docker java home/jre/lib/security/cacerts“-storepass changeit-list | grep
,它将从您放入
/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

=>如果是Docker location,则使用
classpath:/some/location/cerkey.jks
引用Docker实例

=>在docker运行的主机位置,使用
文件:/some/location/cerkey.jks


提示:server.ssl.key store的值

导入证书时遵循了哪些步骤?根据您的描述,您需要将证书添加到信任库(不要与密钥库混淆)。根据您打电话所使用的技术,有不同的方法。例如,对于spring boot,可能是这样的,您还可以使用受信任的证书等更新容器内的jvm。提供有关如何拨打电话的更多详细信息,以便我们能够帮助您。与您的问题无关的评论,但是,您可以/应该使用
WORKDIR/usr/local/tomcat/webapps
而不是
RUN cd/usr/local/tomcat/webapps
来保持它更轻量级和对最佳实践更友好:)@Rao,我尝试了以下方法:从registry.access.redhat.com/rhel7.1 ENV JAVA_HOME=/usr/lib/jvm/jre COPY./certs/My_Root_CA.cer/etc/ssl/certs/COPY./certs/My_issueng_CA.cer/etc/ssl/certs/RUN$JAVA_HOME/bin/keytool-storepasswd-new mysecretpassword-keystore$JAVA_HOME/lib/security/cacerts-storepass-changeit…@Rao,还尝试了以下步骤:添加您的_ca_root.crt/usr/local/share/ca certificates/foo.crt运行更新ca证书步骤,这些步骤在以下位置提供:非常感谢Oleksandr、Rao和Samprog,它起了作用**您不需要DER
keytool
(更确切地说是
CertificateFactory
)至少从2008年的j6开始就能够读取PEM证书,尽管PEM需要额外的文本(如OpenSSL经常放的“注释”)直到2012年的j7。另外,FWIW您可以使用
-noprompt