web-dev-qa-db-fra.com

L'importation de certificats auto-signés dans Docker JRE cacert n'est pas reconnue par le service

  • A Java Service s'exécute à l'intérieur du conteneur Docker, qui accède à l'URL HTTPS externe et son certificat d'auto-signature n'est pas disponible pour le magasin de clés cacert de service/JRE et par conséquent la connexion échoue.
  • D'où l'importation du certificat auto-signé de l'URL externe HTTPS dans le magasin de clés JRE cacert du conteneur Docker. (après avoir vérifié le $Java_HOME env. variable)
  • Redémarrage du conteneur Docker (à l'aide de 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?

12
Zeigeist

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
19
VonC

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:

  1. 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
  1. ajouter un certificat au cacerts extrait à l'aide d'un conteneur temporaire démarré à partir du même dossier qui contient également 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. exécutez votre ou vos conteneurs docker cibles en montant le cacerts extrait avec un paramètre d'exécution, e. g. pour sonarqube:
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.

15
Volker Seibt

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

...
1
povisenko