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
- Docker-Container – Docker