Este artículo analiza principalmente la solución al desarrollo de Java de la solicitud HTTPS SSL no confiable. El análisis específico y el código de implementación son los siguientes.
Al solicitar el enlace HTTPS en el código Java, se puede informar el siguiente error
javax.net.ssl.sslhandshakeException: sun.security.validator.validatorEnception: PKIX Path Building Falling: Sun.Security.Provider.Certpath.SuncertPathBuilderException: No se puede encontrar la ruta de certificación válida a
La razón es que no hay certificado. Está bien usar URL para acceder a ella directamente en el navegador. El navegador debería haber guardado el certificado .cer correspondiente antes.
Hay dos soluciones: obtener un certificado válido de la máquina de destino o ignorar el problema de confianza del certificado.
1. Obtenga un certificado válido para la máquina de destino
1. Compile e instale el programa de certificado Javac InstallCert.java (código de la siguiente manera)
/ * * Copyright 2006 Sun Microsystems, Inc. Todos los derechos reservados. * * Redistribución y uso en formularios de origen y binarios, con o sin * modificación, se permiten siempre que se cumplan las siguientes condiciones *: * * - Las redistribuciones del código fuente deben retener el aviso de copyright * anterior * esta lista de condiciones y el siguiente descargo de responsabilidad. * * - Las redistribuciones en forma binaria deben reproducir el aviso de copyright * anterior *, esta lista de condiciones y la siguiente divulgación en la documentación * y/u otros materiales provistos con la distribución. * * - Ni el nombre de Sun Microsystems ni los nombres de sus * contribuyentes pueden usarse para respaldar o promover productos derivados * de este software sin un permiso previo por escrito específico. * * Este software es proporcionado por los titulares de derechos de autor y contribuyentes "como * es" y cualquier garantía expresa o implícita, incluidas, entre otros, * las garantías implícitas de comerciabilidad y idoneidad para un propósito particular * se denuncian. En ningún caso, el propietario o * contribuyentes * contribuyentes directos, indirectos, indirectos, incidentales, especiales, * ejemplares o consecuentes daños (incluidos, pero no limitados, * adquisición de bienes sustitutos o servicios; pérdida de uso, datos o * ganancias; o interrupción comercial), sin embargo, cualquier teoría de * responsabilidad *, ya sea en contrato, responsabilidad tortuosa o torta (incluida la interación de lo contrario), lo que ocurre en cualquier manera que se produzca en la forma en que se produzca la teoría de la manera o de lo contrario. Uso de este * software *, incluso si se recomienda la posibilidad de tal daño. *// ** *http://blogs.sun.com/andreas/resource/installcert.java *use: *java installcert hostname *Ejemplo: *% java installcert ecc.fedora.redhat.com */import javax.net.ssl. *; import java.io. *; import java.security.key java.security.messageGest; import java.security.cert.certificateException; import java.security.cert.x509certificate;/** * Clase utilizada para agregar el certificado del servidor a la tienda clave * con sus certificados de confianza. */public class InstallCert {public static void main (string [] args) lanza la excepción {string host; int port; char [] passphrase; if ((args.length == 1) || (args.length == 2)) {string [] c = args [0] .split (":"); host = c [0]; port = (c.length == 1)? 443: Integer.ParseInt (c [1]); cadena p = (args.length == 1)? "Changeit": args [1]; passphrase = p.toCarArRay ();} else {system.out.println ("use: java installCert <host> [: port] [passphrase]"); return;} archivo archivo = nuevo archivo ("jssecacerts"); If (file.Isfile () == false) {char sep = archivo. Archivo (system.getProperty ("java.home") + sep + "lib" + sep + "seguridad"); file = nuevo archivo (dir, "jsSecacerts"); if (file.isfile () == false) {file = new File (dir, "cacerts");}} system.out.printlnner FileInputStream (file); KeyStore ks = KeyStore.getInstance (KeyStore.getDefaultType ()); Ks.Load (in, PassPhrase); in.Close (); sslContext context = sslContext.getInstance ("TLS"); TMF de confianza TMF = TrustManagerFactory.getInStance (confianza de confianza de fideicomiso. TrustManager [] {tm}, null); sslsocketFactory factory = context.getSocketFactory (); system.out.println ("Abriendo la conexión a" + host + ":" + port + "..."); sslsocket socket = (sslsocket) factory.createSocket (host, port); SetSotiMeOut (10000); Try {system.out.out ("(host); Setket.setSoTimeOut (10000); Try {system.out.Out. (" HandShake ... "); Socket.StarthandShake (); Socket.close (); System.out.println (); System.out.println (" No hay errores, el certificado ya está confiable ");} Catch (Sslexception e) {System.out.println (); E.PrintStackTrace (System.out);} x509Certificate [] == null) {System.out.println ("no pudo obtener la cadena de certificados del servidor"); return;} bufferedReader lector = new BufferedReader (new InputStreamReader (System.in)); System.out.println (); System.out.println ("Servidor enviado" + Cadena.length + "Certificate (S):"); System.out.Println (););) MessageDigest.getInstance ("Sha1"); MessageDigest md5 = MessageDigest.getInStance ("Md5"); para (int i = 0; i <chain.length; i ++) {x509Certificate cert = cadena [i]; system.out.println ("" + (i + 1) + "sujeto" + " +" + " +" + " +" + " +" + " +" + " +" + " +" + " +" + " +" + " +" + " +" + "SUJET" cert.getSubjectDN ()); System.out.println ("Emisor" + cert.getissuerdn ()); sha1.update (cert.getencoded ()); system.out.println ("sha1" + toHexString (sha1.digest ()); md5.update (cert.getencoded); system.out.out. ("); System.out. ("); md5 " + toHexString (md5.digest ())); system.out.println ();} system.out.println (" Ingrese el certificado para agregar a la tienda de claves de confianza o 'Q' a Quit: [1] "); String Line = Reader.Readline (). TRIM (); int K; intit {k = (line.length () == 0)? 0: Integer.ParseInt (línea) - 1;} Catch (NumberFormateException e) {System.out.println ("KeyStore no cambiado"); return;} x509Certificate cert = Chain [k]; string alias = host + " -" + (k + 1); ks.setCertificateEntry (alias, cert); certificado); neoutstream out = new neoutstou FileOutputStream ("JSSecácerts"); ks.store (out, passphrase); out.close (); system.ut.println (); system.out.println (cert); system.println (); system.out.println (); system.println (); system.out.println ("agregó certificado a certificado a certificado a certificado a la certificado a la certificado a la certificación de la certificado a la certificado de la certificado a la certificado. 'JSSECACERTS' Usando alias '" + alias +"' ");} private static final char [] hexDigits =" 0123456789abcdef ".ToCarArRaRAy (); private static string toHexString (byte [] bytes) {stringBuilder sb = new stringBuilder (bytes.length * 3); for (INT {); & = 0xff; sb.append (hexDigits [b >> 4]); sb.append (hexDigits [b & 15]); sb.append ('');} return sb.ToString ();} private savingTrustManager de savingTrustManager X509 Chain; SavingTrustManager (x509TrustManager tm) {this.tm = tm;} public x509Certificate [] getACceptedIsSuers () {throLe New UnspportedOperationException ();} public void checkClientTrusted (x509Certificate [] cadena, cadena de string) lanza certificadoxception {tirar nueva nueva UnsupportedOperationException ();} public void checkServerTrusted (x509Certificate [] cadena, string authtype) lanza certificateException {this.chain = chain; tm.checkservertrusted (cadena, authtype);}}} 2. Ejecute el programa de certificado de instalación para generar un certificado
java InstallCert my.hoolai.com
Por ejemplo: java InstalCert smtp.zhangsan.com:465 admin Si no se agregan la contraseña y el número de puerto de host, el número de puerto predeterminado dado en el programa de obtención del certificado anterior es: 443, y la contraseña es: Cambiar
3. De acuerdo con la información de solicitud de operación, ingrese 1 e ingrese, y genere un certificado llamado: JSSECACERTS en el directorio actual.
¡Coloque el certificado en el directorio $ java_home/jre/lib/de seguridad, recuerde que el JRE del JDK es el entorno utilizado por el proyecto! ! !
o:
System.setProperty("javax.net.ssl.trustStore", "你的jssecacerts证书路径");
Puede cambiar la contraseña y ejecutar el comando en el directorio de seguridad
keytool -storepasswd -new xxxcom -keystore cacerts
Puede modificar la contraseña y usar el comando después de modificarla
keytool -list -v -keystore cacerts
Al ver la información del archivo, solicitará que necesita una contraseña para verlo. Si la contraseña de entrada coincide con la contraseña modificada, significa que la modificación ha sido exitosa.
PD: En este punto, puede usar con éxito SSL. Además, con base en el archivo JSSECACERTS generados en este momento, puede generar un archivo CER.
El comando es el siguiente
keytool -export -alias xxx.com-1 -keystore jssecacerts -rfc -file xxx.cer
Como se mencionó anteriormente, el alias de nomenclatura predeterminado en la clase de herramienta anterior era agregar "-1". La contraseña establecida utilizando InstallCert debe ser la misma que la contraseña en el archivo Cacherts.
Si ha modificado la contraseña, debe modificar la cadena de contraseña correspondiente en la clase InstallCert, de lo contrario, la siguiente excepción será:
java.security.UnrecoverableKeyException: Password verification failed
2. Ignore el problema de la confianza del certificado
Código fuente: http://mengyang.iteye.com/blog/575671
Asegúrese de tener en cuenta que necesita llamar a los métodos descritos en el artículo antes de que se cree la conexión, así:
TrustAllHttPsCertificates (); hostnameverifier hv = new hostNameverifier () {public boolean verify (string urlhostName, sslsession session) {return true; }}; Httpsurlconnection.setDefaUstHostNameverifier (HV); Connection = (httpurlConnection) url.openconnection ();Ok, ambos métodos han sido probados y trabajados.
Resumir
Lo anterior es todo el contenido de este artículo sobre la solución al problema de la solicitud HTTPS no confiable SSL en Java. Espero que sea útil para todos. Los amigos interesados pueden continuar referiéndose a otros temas relacionados en este sitio. Si hay alguna deficiencia, deje un mensaje para señalarlo. ¡Gracias amigos por su apoyo para este sitio!