服务无法识别将自签名证书导入 Docker 的 JRE cacert
Importing self-signed cert into Docker's JRE cacert is not recognized by the service
- 一个Java服务在Docker容器内运行,它访问外部HTTPSurl并且它的自签名证书对服务/JRE不可用cacert 密钥库,因此连接失败。
- 因此将 HTTPS 外部 URL 的自签名证书导入到 Docker 容器的 JRE cacert 密钥库中。 (检查
$JAVA_HOME
环境变量后)
- 重新启动了 Docker 容器(使用
docker restart
命令),希望服务也能重新启动并从 JRE cacert 中选择更改。但这并没有发生,Java 服务仍然无法访问外部 HTTPS URL.
知道 Docker 容器中的 Java 服务 运行 如何选择 JRE cacert 随着新证书导入的变化吗?
Hence imported the self-signed certificate of HTTPS external URL into Docker container's JRE cacert keystore.
否:您需要将其导入 Docker 图像,您从中 运行 您的容器。
将其导入容器只会创建一个 temporary writable data layer,当您重新启动容器时,它将被丢弃。
类似于:
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
用于使用已经配置好的基于 java 的容器,例如 jenkins、sonarqube 或 nexus (例如,如果你 运行 你自己的构建服务器)我发现使用 docker 运行 的参数将合适的 cacerts
文件安装到这些容器中更方便。
我使用来自 openjdk 的 cacerts
文件作为基础:
- extracting
cacerts
from openjdk image using a temporary container:
docker pull openjdk:latest
docker run --rm --entrypoint cat openjdk:latest /etc/ssl/certs/java/cacerts > cacerts
- adding certificate to the extracted
cacerts
using a temporary container started from the same folder which also contains 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 your target docker container(s) mounting the extracted
cacerts
with a run-parameter, e. g. for sonarqube
:
docker run ... -v /path/to/your/prepared/cacerts:/etc/ssl/certs/java/cacerts:ro ... sonarqube:lts
如果 openjdk 有新版本,您可以使用 1. 和 2.
中的命令更新主机上的 cacerts
文件
要更新目标图像(例如 sonarqube
),您不需要使用 Dockerfile
和 docker build
.
创建自己的图像
这是一个适用于基于 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/
#.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
...
此外,正如您从 Dockerfiles 上面的说明中看到的那样,它们都要求您的 certificate.crt
文件位于同一文件夹中。
- 一个Java服务在Docker容器内运行,它访问外部HTTPSurl并且它的自签名证书对服务/JRE不可用cacert 密钥库,因此连接失败。
- 因此将 HTTPS 外部 URL 的自签名证书导入到 Docker 容器的 JRE cacert 密钥库中。 (检查
$JAVA_HOME
环境变量后) - 重新启动了 Docker 容器(使用
docker restart
命令),希望服务也能重新启动并从 JRE cacert 中选择更改。但这并没有发生,Java 服务仍然无法访问外部 HTTPS URL.
知道 Docker 容器中的 Java 服务 运行 如何选择 JRE cacert 随着新证书导入的变化吗?
Hence imported the self-signed certificate of HTTPS external URL into Docker container's JRE cacert keystore.
否:您需要将其导入 Docker 图像,您从中 运行 您的容器。
将其导入容器只会创建一个 temporary writable data layer,当您重新启动容器时,它将被丢弃。
类似于
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
用于使用已经配置好的基于 java 的容器,例如 jenkins、sonarqube 或 nexus (例如,如果你 运行 你自己的构建服务器)我发现使用 docker 运行 的参数将合适的 cacerts
文件安装到这些容器中更方便。
我使用来自 openjdk 的 cacerts
文件作为基础:
- extracting
cacerts
from openjdk image using a temporary container:
docker pull openjdk:latest
docker run --rm --entrypoint cat openjdk:latest /etc/ssl/certs/java/cacerts > cacerts
- adding certificate to the extracted
cacerts
using a temporary container started from the same folder which also containsldap.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 your target docker container(s) mounting the extracted
cacerts
with a run-parameter, e. g. forsonarqube
:
docker run ... -v /path/to/your/prepared/cacerts:/etc/ssl/certs/java/cacerts:ro ... sonarqube:lts
如果 openjdk 有新版本,您可以使用 1. 和 2.
中的命令更新主机上的cacerts
文件
要更新目标图像(例如 sonarqube
),您不需要使用 Dockerfile
和 docker build
.
这是一个适用于基于 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/
#.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
...
此外,正如您从 Dockerfiles 上面的说明中看到的那样,它们都要求您的 certificate.crt
文件位于同一文件夹中。