$JAVA_HOME )docker restart ), con la esperanza de que el servicio también se reinicie y seleccione los cambios de JRE cacert. Pero esto no sucedió, el servicio Java aún no puede acceder a la URL HTTPS externa.¿Alguna idea de cómo un servicio de Java que se ejecuta dentro del contenedor Docker selecciona los cambios de cacert de JRE con la importación de un nuevo certificado?
Por lo tanto, importó el certificado autofirmado de la URL externa HTTPS al almacén de claves cacert JRE del contenedor Docker.
No: debe importarlo a la imagen de Docker desde la que ejecuta su contenedor.
Importarlo al contenedor solo crearía una capa temporal de datos grabables , que se descartará cuando reinicie su contenedor.
Algo como esta respuesta :
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.cerPara usar contenedores basados en Java ya configurados como jenkins , sonarqube o nexus (por ejemplo, si ejecuta su propio servidor de compilación), me parece más conveniente montar un cacerts adecuado en estos contenedores con un parámetro para docker run.
Uso el archivo cacerts de openjdk como base:
- extrayendo
cacertsde la imagen openjdk usando un contenedor temporal:
docker pull openjdk:latest docker run --rm --entrypoint cat openjdk:latest /etc/ssl/certs/java/cacerts > cacerts
- agregar certificado a los
cacertsextraídos usando un contenedor temporal iniciado desde la misma carpeta que también contieneldap.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'
- ejecute su(s) contenedor(es) acoplable(s) de destino montando los
cacertsextraídos con un parámetro de ejecución, por ejemplo, parasonarqube:
docker run ... -v /path/to/your/prepared/cacerts:/etc/ssl/certs/java/cacerts:ro ... sonarqube:lts Si hay una nueva versión de openjdk , puede actualizar el cacerts en el host con los comandos 1 y 2.
Para actualizar la imagen de destino (por ejemplo sonarqube ) no necesita crear su propia imagen usando Dockerfile y docker build .
Aquí hay una solución que funcionó para la imagen basada en OpenJDK Java 11 .
Una cosa que mencionar antes es que puede usar una imagen JDK o JRE. La segunda opción requerirá ca-certificates-java instalado.
Dockerfile para imagen basada en 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 para imagen basada en 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 ... Además, como puede ver en las instrucciones de Dockerfiles anteriores, ambos requieren que su archivo certificate.crt esté en la misma carpeta.