$Java_HOME
env. variable)docker restart
command), en espérant que le service redémarre également et sélectionne les modifications dans JRE cacert. Mais cela ne s'est pas produit, le service Java ne parvient toujours pas à accéder à l'URL HTTPS externe.Une idée de la façon dont un service Java exécuté dans le conteneur Docker sélectionne les modifications JRE cacert avec une nouvelle importation de certificat?
D'où l'importation du certificat auto-signé de l'URL externe HTTPS dans le magasin de clés JRE cacert du conteneur Docker.
Non: vous devez l'importer dans l'image Docker à partir de laquelle vous exécutez votre conteneur.
L'importer dans le conteneur ne créerait qu'une couche de données accessible en écriture temporaire , qui sera supprimée lorsque vous redémarrerez votre conteneur.
Quelque chose comme cette réponse :
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
Pour utiliser des conteneurs basés sur Java Java comme jenkins, sonarqube ou nexus (par exemple, si vous exécutez votre propre build server) Je trouve plus pratique de monter un fichier cacerts
- approprié dans ces conteneurs avec un paramètre pour docker run.
J'utilise le fichier cacerts
de openjdk comme base:
- extraire
cacerts
de openjdk image à l'aide d'un conteneur temporaire:
docker pull openjdk:latest
docker run --rm --entrypoint cat openjdk:latest /etc/ssl/certs/Java/cacerts > cacerts
- ajouter un certificat au
cacerts
extrait à l'aide d'un conteneur temporaire démarré à partir du même dossier qui contient égalementldap.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'
- exécutez votre ou vos conteneurs docker cibles en montant le
cacerts
extrait avec un paramètre d'exécution, e. g. poursonarqube
:
docker run ... -v /path/to/your/prepared/cacerts:/etc/ssl/certs/Java/cacerts:ro ... sonarqube:lts
S'il existe une nouvelle version de openjdk vous pouvez mettre à jour le fichier cacerts
- sur l'hôte avec les commandes de 1. et 2.
Pour mettre à jour l'image cible (par exemple, sonarqube
), vous n'avez pas besoin de créer votre propre image à l'aide de Dockerfile
et docker build
.
Voici ma solution qui a fonctionné pour moi au sein d'une image basée sur OpenJDK Java 11.
La toute première chose à mentionner que l'utilisation peut utiliser une image JDK ou JRE avec ca-certificates-Java
installé pour le deuxième choix
Voici la solution pour une image basée sur 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
...
Et voici JRE image basée sur:
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
...