Bearbeiten: - Versucht, die Frage und die akzeptierte Antwort in meinem Blog auf präsentablere Weise zu formatieren
Hier ist die Originalausgabe.
Ich erhalte diesen Fehler:
Detaillierte Meldung sun.security.validator.ValidatorException: PKIX-Pfaderstellung fehlgeschlagen:
sun.security.provider.certpath.SunCertPathBuilderException: Es konnte kein gültiger Zertifizierungspfad zum angeforderten Ziel gefunden werdenUrsache javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX-Pfaderstellung fehlgeschlagen: sun.security.provider.certpath.SunCertPathBuilderException: Es konnte kein gültiger Zertifizierungspfad zum angeforderten Ziel gefunden werden
Ich benutze Tomcat 6 als Webserver. Ich habe zwei HTTPS-Webanwendungen auf verschiedenen Tomcats an verschiedenen Ports, aber auf demselben Computer installiert. Sag App1(port 8443)
und
App2(port 443)
. App1
verbindet sich mit App2
. Beim App1
Herstellen einer Verbindung App2
erhalte ich den obigen Fehler. Ich weiß, dass dies ein sehr häufiger Fehler ist, daher bin ich auf viele Lösungen in verschiedenen Foren und auf Websites gestoßen. Ich habe den folgenden Eintrag in server.xml
beiden Tomcats:
keystoreFile="c:/.keystore"
keystorePass="changeit"
Jede Site gibt den gleichen Grund an, warum sich das von app2 erteilte Zertifikat nicht im vertrauenswürdigen Speicher von app1 jvm befindet. Dies scheint auch zuzutreffen, wenn ich versucht habe, dieselbe URL im IE-Browser aufzurufen. Es funktioniert (beim Erwärmen liegt ein Problem mit dem Sicherheitszertifikat dieser Website vor. Hier sage ich, fahren Sie mit dieser Website fort). Aber wenn dieselbe URL vom Java-Client getroffen wird (in meinem Fall), erhalte ich den obigen Fehler. Um es in den Truststore zu stellen, habe ich diese drei Optionen ausprobiert:
Option 1
System.setProperty("javax.net.ssl.trustStore", "C:/.keystore");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
Option2 Einstellung unten in der Umgebungsvariablen
CATALINA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value
Option3 Einstellung unten in der Umgebungsvariablen
JAVA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value
Aber nichts hat funktioniert .
Was zuletzt funktioniert hat, ist die Ausführung des in Wie behandelt man ungültige SSL-Zertifikate mit Apache HttpClient vorgeschlagenen Java-Ansatzes ? von Pascal Thivent dh das Programm InstallCert ausführen.
Dieser Ansatz ist jedoch für das Devbox-Setup in Ordnung, aber ich kann ihn in der Produktionsumgebung nicht verwenden.
Ich frage mich , warum drei Ansätze oben genannten nicht funktioniert , wenn ich die gleichen Werte in erwähnt server.xml
von app2
Server und gleichen Werte in - Vertrauen durch Einstellung
System.setProperty("javax.net.ssl.trustStore", "C:/.keystore") and System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
im app1
Programm.
Für weitere Informationen stelle ich folgende Verbindung her:
URL url = new URL(urlStr);
URLConnection conn = url.openConnection();
if (conn instanceof HttpsURLConnection) {
HttpsURLConnection conn1 = (HttpsURLConnection) url.openConnection();
conn1.setHostnameVerifier(new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
reply.load(conn1.getInputStream());
domainname
meine RHEL-Server richtig eingestellt hatte, war das Problem behoben. Hoffe es hilft jemandem.