Cet article traite principalement de la solution au développement java de la demande HTTPS SSL non fiable. L'analyse et le code de mise en œuvre spécifiques sont les suivants.
Lors de la demande de lien HTTPS dans le code Java, l'erreur suivante peut être signalée
javax.net.ssl.sslhandshakeException: Sun.Security.validator.Validatorexception: PKIX Path Build
La raison en est qu'il n'y a pas de certificat. Il est normal d'utiliser l'URL pour y accéder directement dans le navigateur. Le navigateur aurait dû enregistrer le certificat .Cer correspondant avant.
Il existe deux solutions: l'obtention d'un certificat valide à partir de la machine cible ou ignorer le problème de confiance du certificat.
1. Obtenez un certificat valide pour la machine cible
1. Compiler et installer le programme de certificat Javac InstallerCert.java (code comme suit)
/ * * Copyright 2006 Sun Microsystems, Inc. Tous droits réservés. * * La redistribution et l'utilisation dans les formulaires source et binaire, avec ou sans * modification, sont autorisées à condition que les conditions suivantes * soient remplies: * * - les redistributions du code source doivent conserver le préavis ci-dessus * Avis, cette liste des conditions et la clause de non-responsabilité suivante. * * - Les redistributions sous forme binaire doivent reproduire l'avis de droit d'auteur ci-dessus *, cette liste des conditions et la divulgation suivante dans la documentation * et / ou d'autres matériaux fournis avec la distribution. * * - Ni le nom de Sun Microsystems ni les noms de ses * contributeurs ne peuvent être utilisés pour approuver ou promouvoir les produits dérivés * de ce logiciel sans autorisation écrite préalable spécifique. * * Ce logiciel est fourni par les détenteurs de droits d'auteur et les contributeurs "comme * est" et toutes les garanties expresses ou implicites, y compris, mais sans s'y limiter, * les garanties implicites de qualité marchande et d'adéquation à un usage particulier * sont déclinées. En aucun cas, le titulaire du droit d'auteur ou * les contributeurs ne seront pas responsables de tout dommage directement, indirect, accidentel, spécial, * exemplaire ou consécutif (y compris, mais sans s'y limiter De ce logiciel, même s'il est conseillé de la possibilité de tels dégâts. notre java.security.MessagediGest; import java.security.cert.certificateException; import java.security.cert.x509certificate; / ** * classe utilisée pour ajouter le certificat du serveur à la clé de dos * avec vos certificats de confiance. * / public class installCert {public static void main (string [] args) lève exception {String host; int port; char [] PassPhrase; if ((args.length == 1) || (args.length == 2)) {string [] c = args [0] .split (":"); host = c [0]; port = (c.Legthreng == 1)? 443: Integer.ParseInt (c [1]); String p = (args.length == 1)? "Changeit": args [1]; PassPhrase = P.ToCharArray ();} else {System.out.println ("Utilisation: Java InstallCert <host> [: port] [PassPhrase]"); return;} fichier file = new File ("JSSECACERTS"); if (file.sisfile () File (System.getProperty ("java.home") + sep + "lib" + sep + "Security"); file = new file (dir, "jssecacerts"); if (file.isfile () == false) {file = new File (dir, "cacertts");}} System.out.println ("chargement keystore" + file + "); FileInputStream (fichier); keystore ks = keystore.getInstance (keystore.getDefaultType ()); ksload (in, PassPhrase); in.close (); sslcontext context = sscontex TrustManagerFactory.getInstance (TrustManagerFactory.getDefaultAlgorithm ()); TMF.Init (KS); X509TrustManager de DefaultTrustManager = (x509TrustManager) TMF.GetTrustManagers () [0]; SavingTrustManager TM = New SavingTrustManager (defaultTrustManager); context.init (null, new TrustManager [] {tm}, null); sslsocketfactory factory = context.getSocketFactory (); System.out.println ("Ouverture de connexion à" + host + ":" + port + "..."); sslSocket Socket = (SSLSocket). port); socket.setsoTimeout (10000); try {System.out.println ("Démarrer la poignée de main SSL ..."); socket.starthandshake (); socket.close (); System.out.println (); System.out.println ("pas d'erreurs, le certificat est déjà fiduci Gens InputStreamReader (System.in)); System.out.println (); System.out.println ("Server envoyé" + chaîne.length + "Certificate (s):"); System.out.println (); Messagedigest Sha1 = MessagediGest.getInstance ("sha1"); pour iNTRA = 0; i <chain.length; i ++) {x509Certificate cert = chain [i] Cert.getSiSuerdn ()); sha1.update (cert.getEncoded ()); System.out.println ("sha1" + tohexstring (sha1.digest ())); md5.update (Cert.getEncoded ()); System.out.println ("Md5" + tohexstring (md5.digest ())); System.out.println ();} System.out.println ("Entrez le certificat pour ajouter à la clé de clé de confiance ou 'q' pour quit: [1]"); String Line = Reader.Readline (). 0: Integer.ParseInt (Line) - 1;} catch (NumberFormatexception e) {System.out.println ("Keystore non modifié"); return;} x509Certificate cert = chain [k]; String alias = host + "-" + (k + 1); k.setcertificateNry (Alias, Cert); FileoutputStream ("jssecacerts"); k.store (out, phrase); out.close (); system.out.println (); system.out.println (cert); system.out.println (); system.out.println (); system.out.println (); System.out.out.Println ("ajout du certificat pour Kead.Println (); 'JSSECACERTS' Utilisation d'alias '"+ alias +"' ");} charbon final statique privé [] hexDigits =" 0123456789abcdef ".tocharay (); private static string tohexstring (byte [] bytes) {StringBuilder {b & = 0xff; sb.append (hexDigits [b >> 4]); sb.append (hexDigits [b & 15]); sb.append ('');} return sb.tostring ();} private static SavingTrustManager implémente x509trustmerat {private final x509tronager tm; privilth chaîne; SavingTrustManager (x509TrustManager tm) {this.tm = tm;} public x509certificate [] getAcceptedSisuers () {Throw New UnsupportedOperationException ();} public void CheckClientTruted (x509Certificate [] chaîne, chaîne authtype) throws certificat throw UnportEdOperationException ();} public void CheckServerTruted (x509Certificate [] chaîne, String AuthType) lève CertificateException {this.chain = chain; tm.checkserverTruted (chain, authType);}}} 2. Exécutez le programme de certificat d'installation pour générer un certificat
java InstallCert my.hoolai.com
Par exemple: java InstalCert smtp.zhangsan.com:465 admin Si le mot de passe et le numéro de port hôte ne sont pas ajoutés, le numéro de port par défaut donné dans le programme d'obtention de certificat ci-dessus est: 443, et le mot de passe est: Modifier
3. Selon les informations de l'invite de l'opération, entrez 1 et entrez, et générez un certificat nommé: jssecacerts dans le répertoire actuel.
Placez le certificat dans le répertoire $ Java_Home / Jre / Lib / Security, n'oubliez pas que le JRE du JDK est l'environnement utilisé par le projet! ! !
ou:
System.setProperty("javax.net.ssl.trustStore", "你的jssecacerts证书路径");
Vous pouvez modifier le mot de passe et exécuter la commande dans le répertoire de sécurité
keytool -storepasswd -new xxxcom -keystore cacerts
Vous pouvez modifier le mot de passe et utiliser la commande après l'avoir modifiée
keytool -list -v -keystore cacerts
Lorsque vous affichez les informations du fichier, il vous invite à avoir besoin d'un mot de passe pour les afficher. Si le mot de passe d'entrée correspond au mot de passe modifié, cela signifie que la modification a réussi.
PS: À ce stade, vous pouvez utiliser avec succès SSL. De plus, sur la base du fichier jssecacerts généré à l'heure, vous pouvez générer un fichier CER.
La commande est la suivante
keytool -export -alias xxx.com-1 -keystore jssecacerts -rfc -file xxx.cer
Comme mentionné ci-dessus, l'alias de dénomination par défaut dans la classe d'outils précédents était d'ajouter "-1". La définition de mot de passe à l'aide d'installation doit être la même que le mot de passe dans le fichier Cacherts.
Si vous avez modifié le mot de passe, vous devez modifier la chaîne de mot de passe correspondante dans la classe InstallCert, sinon l'exception suivante sera:
java.security.UnrecoverableKeyException: Password verification failed
2. Ignorez le problème de confiance du certificat
Code source: http://mengyang.iteye.com/blog/575671
Assurez-vous de noter que vous devez appeler les méthodes décrites dans l'article avant la création de la connexion, comme ceci:
TrustAllHTTPSCertificates (); HostNameVierrifier hv = new hostNameVerifier () {public boolean vérifie (String urlHostName, SSLSession Session) {return true; }}.OK, les deux méthodes ont été essayées et travaillées.
Résumer
Ce qui précède est l'intégralité du contenu de cet article sur la solution au problème du SSL de demande HTTPS HTTPS non fiable en Java. J'espère que ce sera utile à tout le monde. Les amis intéressés peuvent continuer à se référer à d'autres sujets connexes sur ce site. S'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien pour ce site!