In diesem Artikel wird hauptsächlich die Lösung für die Java -Entwicklung von HTTPS -Anforderungen SSL nicht vertrauen. Der spezifische Analyse- und Implementierungscode ist wie folgt.
Bei der Anforderung des HTTPS -Links im Java -Code kann der folgende Fehler gemeldet werden
javax.net.ssl.slhandshakeException: sun.security.validator.validatexception: PKIX Pfadaufbau fehlgeschlagen
Der Grund dafür ist, dass es kein Zertifikat gibt. Es ist in Ordnung, URL zu verwenden, um direkt im Browser darauf zuzugreifen. Der Browser hätte das entsprechende .cer -Zertifikat zuvor gespeichert haben sollen.
Es gibt zwei Lösungen: ein gültiges Zertifikat von der Zielmaschine oder das Ignorieren des Problems der Zertifikatsvertrauen.
1. Ermitteln Sie ein gültiges Zertifikat für die Zielmaschine
1. Kompilieren und installieren Sie das Zertifikatprogramm Javac installcert.java (Code wie folgt).
/ * * Copyright 2006 Sun Microsystems, Inc. Alle Rechte vorbehalten. * * Umverteilung und Verwendung in Quellen- und Binärformularen mit oder ohne * Änderung sind zulässig, sofern die folgenden Bedingungen erfüllt sind: * * - Umverteilungen des Quellcode müssen die oben genannte Copyright * -No, diese Liste der Bedingungen und die folgenden Haftungsausschluss beibehalten. * * - Umverteilungen in binärer Form müssen die oben genannte Urheberrechte, diese Liste der Bedingungen und die folgende Offenlegung in der Dokumentation und/oder anderen mit der Verteilung bereitgestellten Materialien reproduzieren. * * - Weder der Name von Sun Microsystems noch die Namen seiner * Mitwirkenden können verwendet werden, um Produkte aus dieser Software ohne bestimmte schriftliche Genehmigung zu unterstützen oder zu fördern. * * Diese Software wird von den Inhabern und Mitwirkenden des Urheberrechts bereitgestellt "als * ist" und alle ausdrücklichen oder implizite Garantien, einschließlich, aber nicht beschränkt auf * die impliziten Garantien für Handelsfähigkeit und Eignung für einen bestimmten * Zweck, werden abgewiesen. In keiner Veranstaltung haftet der Urheberrechtsinhaber oder die Mitwirkenden für direkte, indirekte, zufällige, besondere, * beispielhafte oder Folgeschäden (einschließlich, aber nicht beschränkt auf * Beschaffung von Ersatzwaren oder -dienstleistungen; Verlust von Anwendungen, Datenverlust, Daten oder * Gewinne; oder geschäftliche Unterbrechung). Diese * Software, auch wenn sie über die Möglichkeit eines solchen Schadens informiert wird. *// ** *http://blogs.sun.com/andreas/resource/installcert.java *Verwenden: *Java installcert hostname *Beispiel: *% Java installcert ecc.fedora.redhat.com */import Javax.net.SL. java.security.messagedigest; importieren java.security.cert.certificateException; importieren java.security.cert.x509certificate;/** * Klasse, mit der das Zertifikat des Servers dem Keystor * mit Ihren vertrauenswürdigen Zertifikaten hinzugefügt wurde. */public class installCert {public static void main (String [] args) löst Ausnahme aus {String -Host; int port; char [] passphrase; if ((args.Length == 1) || (args.length == 2)) {String [] c = args [0] .sPlit (":": "); 443: Integer.ParseInt (c [1]); String p = (argsgth == 1)? "ChangeEt": args [1]; Passphrase = p.toCharArray ();} else {System.out.println ("Verwendung: Java installCert <Host> [: port] [passphrase]"); return;} Datei file = new File ("jsSecacerts"); Datei (System.getProperty ("java.home") + sep + "lib" + sep + "Sicherheit"); Datei = new Datei (DIR, "JSSECACTS"); if (file.isfile () == false) {Datei = new File (Dir, "Cacerts");}} system. FileInputStream (Datei); Keystore ks = keystore.getInstance (keystore.getDefaulttype ()); TrustManagerFactory.getInStance (treutreuelfactory.getDefaultalgorithmus ()); TrustManager [] {tm}, null); {System.out.println ("SSL Handshake starten ..."); Socket.startHandShake (); Socket.close (); System.out.println (); System.out.println ("Keine Fehler, Zertifikat ist bereits vertrauenswürdig");} catch (sslexception e) {System.out.println (); e.printstacktrace (System.out);} x509Certificate [] chain = tm.chain; if (chain == null) {System.out.println ("konnte keine Serverzertifikatkette erhalten; InputStreamReader (System.in)); System.out.println (); System.out.println ("Server gesendet" + kette 0; sha1 " + tohexstring (sha1.Digest ())); [1] "); String line = reader.readline (). Trim (); int k; try {k = (line.length () == 0)? 0: Integer.ParseInt (Zeile) - 1;} catch (numberFormatexception e) {System.out.println ("Keystore nicht geändert"); return;} x509Certificate cert = ketten [k]; String alias = host + " -" + (k + 1); FileOutputStream ("JSSecacerts"); Verwenden von alias '" + alias +"' ");} private statische endgültige char [] hexDigits =" 0123456789abcdef ".toarArray (); 0xff; Sb.Append (HexDigits [B >> 4]); chain;SavingTrustManager(X509TrustManager tm) {this.tm = tm;}public X509Certificate[] getAcceptedIssuers() {throw new UnsupportedOperationException();}public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {throw new UnsupportedOperationException();}public void CheckServertrusted (x509certificate [] kette, String authType) löst CertificateException {this.chain = ketten; 2. Führen Sie das Installationszertifikatprogramm aus, um ein Zertifikat zu generieren
java InstallCert my.hoolai.com
Zum Beispiel: java InstalCert smtp.zhangsan.com:465 admin Wenn das Passwort und die Host -Portnummer nicht hinzugefügt werden, lautet die Standardportnummer im obigen Zertifikatprogramm: 443 und das Kennwort: ChangeIt
3. Geben Sie gemäß den Informationen zur Eingabeaufforderung 1 ein und erstellen Sie ein Zertifikat mit dem Namen JSSECACTS im aktuellen Verzeichnis.
Platzieren Sie das Zertifikat in das Verzeichnis $ java_home/jre/lib/security, denken Sie daran, dass die JRE der JDK die von dem Projekt verwendete Umgebung ist! ! !
oder:
System.setProperty("javax.net.ssl.trustStore", "你的jssecacerts证书路径");
Sie können das Passwort ändern und den Befehl im Sicherheitsverzeichnis ausführen
keytool -storepasswd -new xxxcom -keystore cacerts
Sie können das Kennwort ändern und den Befehl verwenden, nachdem Sie es geändert haben
keytool -list -v -keystore cacerts
Wenn Sie die Informationen der Datei anzeigen, fordert Sie ein Passwort zum Anzeigen auf. Wenn das Eingabekennwort dem geänderten Kennwort übereinstimmt, bedeutet dies, dass die Änderung erfolgreich war.
PS: Zu diesem Zeitpunkt können Sie SSL erfolgreich verwenden. Darüber hinaus können Sie basierend auf der Datei JSSECACTS, die gerade erzeugt wurden, eine CER -Datei erstellen.
Der Befehl lautet wie folgt
keytool -export -alias xxx.com-1 -keystore jssecacerts -rfc -file xxx.cer
Wie oben erwähnt, bestand der Standardnamen-Alias in der vorherigen Werkzeugklasse zum Hinzufügen von "-1". Das mit InstallCert festgelegte Kennwort muss dem Kennwort in der Cacherts -Datei übereinstimmen.
Wenn Sie das Kennwort geändert haben, müssen Sie die entsprechende Kennwortzeichenfolge in der InstallCert -Klasse ändern, andernfalls lautet die folgende Ausnahme:
java.security.UnrecoverableKeyException: Password verification failed
2. Ignorieren Sie die Ausgabe des Zertifikatsvertrauens
Quellcode: http://mengyang.iteye.com/blog/575671
Beachten Sie unbedingt, dass Sie die im Artikel beschriebenen Methoden aufrufen müssen, bevor die Verbindung erstellt wird, wie folgt:
treueallHttpsCertificates (); HostNameVierer hv = new HostNameVerifier () {public boolean verifizieren (String urlHostName, SSLSession Session) {return true; }};Ok, beide Methoden wurden versucht und bearbeitet.
Zusammenfassen
Das obige ist der gesamte Inhalt dieses Artikels über die Lösung für das Problem nicht vertrauenswürdiger HTTPS -Anforderungs -SSL in Java. Ich hoffe, es wird für alle hilfreich sein. Interessierte Freunde können weiterhin auf andere verwandte Themen auf dieser Website verweisen. Wenn es Mängel gibt, hinterlassen Sie bitte eine Nachricht, um darauf hinzuweisen. Vielen Dank an Freunde für Ihre Unterstützung für diese Seite!