Импорт самозаверяющего сертификата в JRE cacert Docker не распознается службой

  • Служба Java работает внутри контейнера Docker, который обращается к внешнему URL-адресу HTTPS, а его самозаверяющий сертификат недоступен для хранилища ключей службы / JRE cacert, и, следовательно, соединение не устанавливается.
  • Следовательно, импортировал самоподписанный сертификат внешнего URL-адреса HTTPS в хранилище ключей JRE cacert контейнера Docker. (после проверки $JAVA_HOME окр. переменная)
  • Перезапустил Docker-контейнер (используя docker restart команда), надеясь, что служба также будет перезапущена и выберет изменения из JRE cacert. Но этого не произошло, сервис Java по-прежнему не может получить доступ к внешнему URL-адресу HTTPS.

Любая идея, как служба Java, работающая внутри контейнера Docker, выбирает изменения JRE cacert при импорте нового сертификата?

4 ответа

Решение

Следовательно, импортировал самоподписанный сертификат внешнего URL-адреса HTTPS в хранилище ключей JRE cacert контейнера Docker.

Нет: вам нужно импортировать его в образ 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

Для использования уже настроенных контейнеров на основе Java, таких как jenkins, sonarqube или nexus (например, если вы запускаете свой собственный сервер сборки), я считаю более удобным смонтировать подходящий cacerts-файл в эти контейнеры с параметром для запуска Docker.

Я использую cacerts файл из openjdk в качестве базы:

  1. экстрагирование cacerts из изображения openjdk с использованием временного контейнера:
docker pull openjdk:latest
docker run --rm --entrypoint cat openjdk:latest /etc/ssl/certs/java/cacerts > cacerts
  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'
  1. запустите ваш целевой док-контейнер (ы), монтирующий извлеченный cacerts с параметром выполнения, например, для sonarqube:
docker run ... -v /path/to/your/prepared/cacerts:/etc/ssl/certs/java/cacerts:ro ... sonarqube:lts

Если есть новая версия openjdk, вы можете обновить cacerts-файл на хосте с командами от 1. и 2.

Для обновления целевого изображения (например, 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/

#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 файл должен находиться в той же папке.

Надеюсь, это поможет!

Я столкнулся с аналогичной проблемой, это разочаровывает, как, когда вам действительно нужно, она не работает должным образом только тогда, когда системная дата совпадает с датой сертификата (как и ожидалось), пожалуйста, всегда выполняйте этот базовый шаг, иначе вы здесь для большое разочарование ...

Другие вопросы по тегам