Java >> Java Tutorial >  >> Java

So lösen Sie PKIX Path Building Failed in Docker Container

Stellen Sie sich das folgende Szenario vor, in dem ein Docker-Container SSLHandshakeException ausgelöst hat. Sie führen einen Dienst in einem Docker-Container aus. Dieser Dienst ruft einen anderen Dienst in einem anderen Docker-Container auf und die API-Aufrufe schlagen mit folgendem Fehler fehl:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: 
unable to find valid certification path to requested target

In diesem Beitrag werde ich zeigen, wie SSLHandshakeException innerhalb des Docker-Containers mit einer einfachen Lösung behoben werden kann.

Zuvor habe ich in diesem Beitrag gezeigt, wie Sie Ihre Dienste mit dem Docker-Container ausführen.

Dieses Szenario ist sehr häufig bei Microservices, die in Docker-Containern ausgeführt werden. Außerdem gibt es einige Möglichkeiten, wie Sie dieses Problem lösen können, aber ich werde eine Standardmethode zur Lösung dieses Problems vorschlagen.

Die Standardlösung besteht darin, ein SSL-Zertifikat des Zieldienstes zu erhalten und dieses Zertifikat in den Schlüsselspeicher der Java-Laufzeit zu importieren, die der aufrufende Dienst verwendet.

Wie lösen wir Docker Container – SSLHandshakeException?

Das Dilemma besteht, weil jedes Mal, wenn Sie den Docker-Container stoppen und einen Docker-Container neu starten oder beenden und neu starten, die Container-ID geändert wird. Damit können Sie nicht sicher sein, wo JAVA_HOME Ihres aufrufenden Dienstes vorhanden ist.

Je nachdem, welche Java-Umgebung Sie für Ihren Docker-Container verwenden, können Sie also am einfachsten einen cacerts kopieren Keystore-Datei von Ihrem lokalen Hostcomputer in den Docker-Container, wenn Sie das Docker-Image erstellen.

Bevor Sie cacerts kopieren stellen Sie sicher, dass Sie das SSL-Zertifikat des Zieldienstes importieren. Sie können keytool verwenden Befehl zum Importieren dieses Zertifikats.

Fügen Sie nun den folgenden Befehl in Ihr ein Dockerfile

COPY ./cacerts /usr/lib/jvm/java-1.8.0-amazon-corretto.x86_64/jre/lib/security/cacerts

Dadurch wird Ihr Docker-Image erstellt und das Problem PKIX Path Building Failed behoben Fehler.

Nachteil

Ein Nachteil dieser Lösung besteht darin, dass Sie sicherstellen müssen, dass Ihr Basis-Docker-Image den im Befehl erwähnten jvm-Pfad enthält. Wenn es sich von oben unterscheidet, müssen Sie das zuerst finden. Auch wenn Sie mehrere Dienste aufrufen, müssen Sie SSL-Zertifikate von all diesen Diensten erhalten.

Beachten Sie, dass dies nicht in Ihrer Produktionsumgebung, sondern hauptsächlich in der Entwicklungs-Sandbox passieren sollte. Die Produktionsumgebung sollte über von einer Zertifizierungsstelle signierte SSL-Zertifikate auf dem Load Balancer verfügen, und alle Ihre Dienste sollten sich hinter diesem Load Balancer befinden und dasselbe Zertifikat gemeinsam nutzen.

Referenzen

  1. Docker-Container – Docker

Java-Tag