it-swarm.com.de

PKIX-Pfaderstellung in Java-Anwendung fehlgeschlagen

Ich habe seit fast einer Woche Probleme, meine Anwendungen zum Laufen zu bringen, nachdem ich meine Anwendungen von Windows 2000 auf Windows 2008 R2 Server verschoben habe.

Der Ablauf:

  1. Installiertes Java JDK 1.7.0_25
  2. Setzen Sie die Systemumgebungsvariable Java_HOME auf C:\Progra~1\Java\jdk1.7.0_25\.
  3. Importierte das Zertifikat in cacerts mit keytool
  4. Sichergestellt, dass das Zertifikat in keytool mit -list vorhanden ist.

Ich habe versucht, step 3 mit InstallCert zu wiederholen, um sicherzustellen, dass ich nichts durcheinander gebracht habe.

Die oben genannten Methoden haben mein Problem nicht gelöst, also versuchte ich es programmgesteuert:

System.setProperty("javax.net.ssl.trustStore",
"C:/Progra~1/Java/jdk1.7.0_25/jre/lib/security/cacerts");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

Immer noch ohne Glück. Ich bin festgefahren und nicht ganz sicher, in welche Richtung ich gehen soll.

Stack-Trace:

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
    at Sun.security.ssl.Alerts.getSSLException(Alerts.Java:192)
    at Sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.Java:1886)
    at Sun.security.ssl.Handshaker.fatalSE(Handshaker.Java:276)
    at Sun.security.ssl.Handshaker.fatalSE(Handshaker.Java:270)
    at Sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.Java:1341)
    at Sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.Java:153)
    at Sun.security.ssl.Handshaker.processLoop(Handshaker.Java:868)
    at Sun.security.ssl.Handshaker.process_record(Handshaker.Java:804)
    at Sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.Java:1016)
    at Sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.Java:1312)
    at Sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.Java:1339)
    at Sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.Java:1323)
    at Sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.Java:515)
    at Sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.Java:185)
    at Sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.Java:153)
    at util.SMS.send(SMS.Java:93)
    at domain.ActivationSMSSenderMain.sendActivationMessagesToCustomers(ActivationSMSSenderMain.Java:80)
    at domain.ActivationSMSSenderMain.<init>(ActivationSMSSenderMain.Java:44)
    at domain.ActivationSMSSenderMain.main(ActivationSMSSenderMain.Java:341)
Caused by: Sun.security.validator.ValidatorException: PKIX path building failed: Sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at Sun.security.validator.PKIXValidator.doBuild(PKIXValidator.Java:385)
    at Sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.Java:292)
    at Sun.security.validator.Validator.validate(Validator.Java:260)
    at Sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.Java:326)
    at Sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.Java:231)
    at Sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.Java:126)
    at Sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.Java:1323)
    ... 14 more
Caused by: Sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at Sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.Java:196)
    at Java.security.cert.CertPathBuilder.build(CertPathBuilder.Java:268)
    at Sun.security.validator.PKIXValidator.doBuild(PKIXValidator.Java:380)
    ... 20 more

UPDATE:

Sowohl System.out.println(System.getProperty("javax.net.ssl.trustStore")); Als auch System.out.println(System.getProperty("javax.net.ssl.keyStore")); 

gibt null zurück.

33
JavaCake

Ich bin auf ähnliche Probleme gestoßen, deren Ursache und Lösung sich als ziemlich einfach herausstellten:

Main Cause: Das richtige Zertifikat wurde nicht mit Keytool importiert 

HINWEIS: Importieren Sie nur Stammzertifizierungsstellen (oder Ihre eigenen selbstsignierten Zertifikate)

HINWEIS: Importieren Sie kein Root-Zertifikat mit der Bezeichnung, das keine Zertifikatkette ist.

Lösungsbeispiel für imap.gmail.com

  1. Bestimmen Sie das Root-CA-Zertifikat: 

    openssl s_client -showcerts -connect imap.gmail.com:993
    

    in diesem Fall ist die Stammzertifizierungsstelle Equifax Secure Certificate Authority.

  2. Laden Sie Root-CA-Zertifikat herunter.
  3. Vergewissern Sie sich, dass das heruntergeladene Zertifikat über die richtigen SHA-1- und/oder MD5-Fingerabdrücke verfügt, indem Sie es mit info hier vergleichen.
  4. Importzertifikat für javax.net.ssl.trustStore:

    keytool -import -alias gmail_imap -file Equifax_Secure_Certificate_Authority.pem
    
  5. Führen Sie Ihren Java-Code aus 
31
jb1

Sie haben das Zertifikat in den Truststore der im JDK bereitgestellten JRE importiert, führen jedoch die Java.exe der direkt installierten JRE aus.

EDIT

Zur Verdeutlichung und zur Beseitigung des Missverständnisses im nachstehenden Kommentar müssen Sie das Zertifikat in die cacerts-Datei der JRE importieren, die Sie verwenden möchten, JDK, da Clients normalerweise kein JDK haben. Alles in dem folgenden Kommentar, der auf etwas anderes hinweist, sollte ignoriert werden, da ich hier nicht meine Absicht ausdrückt.

Eine weitaus bessere Lösung wäre, Ihren own truststore zu erstellen, beginnend mit einer Kopie der cacerts-Datei, und Java ausdrücklich über die Systemeigenschaft javax.net.ssl.trustStore. mitzuteilen, dass diese verwendet werden soll.

Sie sollten diesen Teil Ihres Build-Prozesses erstellen, um sich über Änderungen in der cacerts-Datei auf dem Laufenden zu halten, die durch JDK-Upgrades verursacht wurden.

9
user207421

Wenn Sie Eclipse verwenden, müssen Sie nur die Eclipse Windows -> Voreinstellungen ----> Java ---> installierte JREs überprüfen zeigt auf die aktuelle JRE und die JRE, für die Sie Ihr Zertifikat konfiguriert haben. Wenn nicht, entfernen Sie die JRE und fügen Sie die JRE hinzu, wo Ihr Zertifikat installiert ist

Unter Windows können Sie folgende Schritte ausführen:

  1. Laden Sie ein Zertifikat der Stammzertifizierungsstelle von der Website herunter.
  2. Suchen Sie eine Datei jssecacerts im Verzeichnis /lib/security Mit JRE (Sie können einen Befehl System.out.println(System.getProperty("Java.home"); verwenden, um den Ordner mit der aktuellen JRE zu finden). Erstellen Sie eine Sicherungskopie der Datei.
  3. Laden Sie ein Programm herunter portecle .
  4. Öffnen Sie die Datei jssecacerts in portecle.
  5. Geben Sie das Passwort ein: changeit.
  6. Importieren Sie das heruntergeladene Zertifikat mit porticle (Extras> Vertrauenswürdiges Zertifikat importieren).
  7. Klicken Sie auf Speichern.
  8. Ersetzen Sie die ursprüngliche Datei jssecacerts.
0
Ilya Lysenko

Für Ihr Pastebin müssen Sie das proxy.tkk.com-Zertifikat dem Truststore hinzufügen.

0
Sean Baker

In meinem Fall wurde das Problem gelöst, indem Oracle offizielles JDK 10 installiert wurde, anstatt das Standard-OpenJDK zu verwenden, das mit Ubuntu geliefert wurde. Dies ist der Leitfaden, dem ich folgte: https://www.linuxuprising.com/2018/04/install-Oracle-Java-10-in-ubuntu-or.html

0
acohen