服务无法识别将自签名证书导入Docker的JRE cacert

时间:2017-01-06 02:12:46

标签: java docker https docker-compose docker-machine

  • Java服务正在Docker容器中运行,该容器访问外部HTTPS URL,并且其自签名证书对于服务/ JRE cacert密钥库不可用,因此连接失败。
  • 因此将HTTPS外部URL的自签名证书导入Docker容器的JRE cacert密钥库。 (在检查$JAVA_HOME env。变量后)
  • 重新启动Docker容器(使用docker restart命令),希望该服务也重新启动并从JRE cacert中选择更改。但是这没有发生,Java服务仍然无法访问外部HTTPS URL。

知道在Docker容器中运行的Java服务如何通过新证书导入选择JRE cacert更改?

3 个答案:

答案 0 :(得分:15)

  

因此将HTTPS外部URL的自签名证书导入Docker容器的JRE cacert密钥库。

否:您需要将其导入到运行容器的Docker 映像中。

将其导入容器只会创建一个temporary writable data layer,当您重新启动容器时,它将被丢弃。

this answer

USER root
COPY ldap.cer $JAVA_HOME/jre/lib/security
RUN \
    cd $JAVA_HOME/jre/lib/security \
    && keytool -keystore cacerts -storepass changeit -noprompt -trustcacerts -importcert -alias ldapcert -file ldap.cer

答案 1 :(得分:12)

使用已经配置的基于java的容器,如 jenkins sonarqube nexus (例如,如果你运行自己的构建服务器),我发现它使用docker run参数将这个容器安装到合适的cacerts文件更方便。

我使用 openjdk 中的cacerts文件作为基础:

  
      
  1. 使用临时容器从 openjdk 图像中提取cacerts
  2.   
docker pull openjdk:latest
docker run --rm --entrypoint cat openjdk:latest /etc/ssl/certs/java/cacerts > cacerts
  
      
  1. 使用从包含cacerts的同一文件夹开始的临时容器将证书添加到解压缩的ldap.cer
  2.   
docker run --rm -v `pwd`:/tmp/certs openjdk:latest bash -c 'cd /tmp/certs && keytool -keystore cacerts -storepass changeit -noprompt -trustcacerts -importcert -alias buenting-root -file ldap.cer'
  
      
  1. 运行目标docker容器,使用run-parameter,e,挂载提取的cacerts。 G。 sonarqube
  2.   
docker run ... -v /path/to/your/prepared/cacerts:/etc/ssl/certs/java/cacerts:ro ... sonarqube:lts

如果有新版本的 openjdk ,您可以使用1.和2中的命令更新主机上的cacerts文件。

要更新目标图片(例如sonarqube),您无需使用Dockerfiledocker build创建自己的图片。

答案 2 :(得分:4)

以下是适用于基于OpenJDK Java 11 的映像的解决方案。

之前要提到的是您可以使用JDK映像或JRE。第二个选项将需要安装ca-certificates-java

  • Dockerfile用于基于JDK的图像
FROM openjdk:11-jdk-slim
WORKDIR /opt/workdir/

#.crt file in the same folder as your Dockerfile
ARG CERT="certificate.crt"

#import cert into java
COPY $CERT /opt/workdir/
RUN keytool -importcert -file $CERT -alias $CERT -cacerts -storepass changeit -noprompt

...
  • Dockerfile用于基于JRE的图像
FROM openjdk:11-jre-slim
WORKDIR /opt/workdir/

#installing ca-certificates-java to import the certificate
RUN mkdir -p /usr/share/man/man1 \
    && apt-get update \
    && apt-get install -y ca-certificates-java

#.crt file in the same folder as your Dockerfile
ARG CERT="certificate.crt"

#import cert into java
COPY $CERT /opt/workdir/
RUN keytool -importcert -file $CERT -alias $CERT -cacerts -storepass changeit -noprompt

...

此外,从上面的Dockerfiles指令中可以看到,它们两个都要求您的certificate.crt文件位于同一文件夹中。

希望有帮助!