Импорт самозаверяющего сертификата в 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 в качестве базы:
- экстрагирование
cacerts
из изображения openjdk с использованием временного контейнера:
docker pull openjdk:latest
docker run --rm --entrypoint cat openjdk:latest /etc/ssl/certs/java/cacerts > cacerts
- добавление сертификата в извлеченный
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'
- запустите ваш целевой док-контейнер (ы), монтирующий извлеченный
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
файл должен находиться в той же папке.
Надеюсь, это поможет!
Я столкнулся с аналогичной проблемой, это разочаровывает, как, когда вам действительно нужно, она не работает должным образом только тогда, когда системная дата совпадает с датой сертификата (как и ожидалось), пожалуйста, всегда выполняйте этот базовый шаг, иначе вы здесь для большое разочарование ...