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

Zei*_*ist 10 java https docker docker-compose docker-machine

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

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

Von*_*onC 18

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

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

将其导入容器只会创建一个临时可写数据层,当您重新启动容器时将丢弃该数据层.

这样的回答:

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


Vol*_*ibt 13

对于使用已经配置的基于java的容器,如jenkins,sonarqubenexus(例如,如果你运行自己的构建服务器),我发现使用docker run cacerts参数将合适的-file 安装到这些容器中会更方便.

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

  1. 使用临时容器cacertsopenjdk映像中提取:
docker pull openjdk:latest
docker run --rm --entrypoint cat openjdk:latest /etc/ssl/certs/java/cacerts > cacerts
Run Code Online (Sandbox Code Playgroud)
  1. cacerts使用从同一文件夹开始的临时容器添加证书到提取,该文件夹还包含ldap.cer:
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'
Run Code Online (Sandbox Code Playgroud)
  1. 运行目标docker容器,安装cacerts使用run-parameter 提取的内容,例如sonarqube:
docker run ... -v /path/to/your/prepared/cacerts:/etc/ssl/certs/java/cacerts:ro ... sonarqube:lts
Run Code Online (Sandbox Code Playgroud)

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

要更新目标图像(例如sonarqube),您不需要使用Dockerfile和创建自己的图像docker build.

  • 这可能很好,直到您的图像提供程序决定更改Java版本.保留旧的"cacerts"文件可能会产生无法预料的后果,包括信任不再受信任的CA. 为避免这种情况,您必须跟踪感兴趣的图像中的Java版本更改,并在发生这种情况时提取新文件.因此,它不再那么方便了. (2认同)

pov*_*nko 7

这是一个适用于基于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

...
Run Code Online (Sandbox Code Playgroud)
  • Dockerfile对于基于 JRE 的图像
FROM openjdk:11-jre-slim
WORKDIR /opt/workdir/

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

#installing ca-certificates-java and then import cert into java
COPY $CERT /opt/workdir/
RUN mkdir -p /usr/share/man/man1 \
    && apt-get update \
    && apt-get install -y ca-certificates-java \
    && keytool -importcert -file $CERT -alias $CERT -cacerts -storepass changeit -noprompt

...
Run Code Online (Sandbox Code Playgroud)

此外,正如您从上面 Dockerfiles 的说明中看到的那样,它们都要求您的certificate.crt文件位于同一文件夹中。