Je suis nouveau sur Docker et j'essaie de l'apprendre. J'utilise Docker Quickstart Terminal sur Windows 7. J'ai une simple exigence lorsque j'utilise Tomcat dans un conteneur Docker. Mon DockerFile est comme suit:
FROM Tomcat:8.0.47-jre7
RUN cd /usr/local/Tomcat/webapps
COPY test.war /usr/local/Tomcat/webapps/test.war
Ensuite, j'émets des commandes de génération et d'exécution simples dans la console Docker.
test.war est un service Web Java. Ce service Web appelle en interne d'autres services Web sur des hôtes distants à l'aide de HTTPS. J'ai les certificats pour les hôtes distants.
J'ai essayé plusieurs façons disponibles sur Internet pour importer ou copier ces certificats vers différents endroits comme mentionné sur différents forums/blogs, mais en vain. Chaque fois que j'utilise HTTPS pour appeler le service Web externe à partir de test.war, cela me donne une erreur de prise de contact SSL.
J'ai également un magasin de clés Java. J'ai essayé d'utiliser Java également dans mon fichier Docker et j'ai essayé d'utiliser le magasin de clés, mais encore une fois, en vain.
Lorsque j'utilise le même test.war sur le Tomcat installé directement sur ma machine, cela fonctionne parfaitement.
Quelqu'un peut-il m'aider en fournissant les étapes pour pouvoir importer/utiliser des certificats SSL/keystore dans ce scénario. De plus, comment puis-je importer plusieurs certificats?
Vous pouvez essayer d'importer le certificat dans le magasin de confiance jvm à l'intérieur de docker.
J'ai les certificats pour les hôtes distants.
Vous pouvez utiliser ces certificats mais en fait vous n'en avez pas besoin, vous avez seulement besoin du certificat racine de l'autorité qui a émis les certificats. Vous pouvez le télécharger sur Internet.
Habituellement, ils sont donnés au format pem
, mais vous aurez besoin de der
pour jvm.
Vous devez d'abord convertir le certificat:
openssl x509 -in ca.pem -inform pem -out ca.der -outform der
Ensuite, installez-le dans le magasin de clés jvm:
keytool -importcert -alias startssl -keystore \
$Java_HOME/lib/security/cacerts -storepass changeit -file ca.der
Cette commande vous demande si vous voulez vraiment ajouter le certificat, vous devez taper "oui".
Et tous ensemble dans un Dockerfile
:
FROM Tomcat:8.0.47-jre7
COPY ca.pem ca.pem
RUN openssl x509 -in ca.pem -inform pem -out ca.der -outform der
RUN echo yes | keytool -importcert -alias startssl -keystore \
/docker-Java-home/jre/lib/security/cacerts -storepass changeit -file ca.der
COPY test.war /usr/local/Tomcat/webapps/test.war
WORKDIR /usr/local/Tomcat/webapps
Remarque: si vous avez déjà un certificat au format der
, vous n'avez pas besoin d'appeler openssl
, copiez simplement le certificat directement.
Pour vérifier que le certificat est vraiment appliqué, vous pouvez exécuter le conteneur, ssh dedans
$ docker exec -it <CONTAINER-ID> bash
et vérifiez le magasin de clés:
$ keytool -keystore "/docker-Java-home/jre/lib/security/cacerts" -storepass changeit -list | grep <NAME-OF-YOUR-CERT-AUTHORITY>
Pour les applications Java dans les images RHEL/Centos, vous pouvez utiliser update-ca-trust
, qui mettra à jour vos magasins de confiance pour vous, à partir des fichiers que vous placez dans /etc/pki/ca-trust
. Il accepte également .pem
fichiers directement:
FROM ...
USER root
COPY yourcertificate.pem /etc/pki/ca-trust/source/anchors/yourcertificate.pem
RUN update-ca-trust
Cela mettra à jour /etc/pki/Java/cacerts
pour vous automatiquement, afin que Java fasse confiance au nouveau certificat.
Ou, si votre certificat est hébergé sur un serveur Web, vous pouvez utiliser curl
pour le télécharger au lieu de copier le fichier - par exemple:
RUN curl -k https://badssl.com/certs/ca-untrusted-root.crt -o /etc/pki/ca-trust/source/anchors/ca-untrusted-root.crt && \
update-ca-trust
classpath:/some/location/cerkey.jks
en cas d'emplacement Docker, pour référencer l'instance de docker.file:/some/location/cerkey.jks
dans le cas de l'emplacement de l'hôte, où le docker est en cours d'exécution.Indice: valeur de server.ssl.key-store