Conexiones HTTPS

Iniciado por alzehimer_cerebral, 17 Agosto 2010, 20:36 PM

0 Miembros y 1 Visitante están viendo este tema.

alzehimer_cerebral

Hola estoy intentando descargar un archivo mediante una conexio Https y me salta uan excepcion que no logro corregir.

Las clases que implementan la conexion HTTPS son las siguientes:

Código (java) [Seleccionar]

public class Https {




     public static void main(String args[]) throws MalformedURLException, NoSuchAlgorithmException, Exception {

        //System.setProperty("javax.net.ssl.trustStore","tomcatKeystore");

        //Para aceptar certificados que no estan en el keystore del cliente
        SSLContext sc = SSLContext.getInstance("TLS");
        sc.init(null, new TrustManager[] { new SimpleTrustManager1() }, null);
        SSLSocketFactory ssf = sc.getSocketFactory();

        System.out.println("Antes URL");
        URL url = new URL("https://192.168.2.2/PESADO.xml");
        HttpsURLConnection urlConection = (HttpsURLConnection) url.openConnection();
        urlConection.setSSLSocketFactory(ssf);
        //urlConection.setHostnameVerifier(new SimpleHostnameVerifier());

        urlConection.connect();

       
        System.out.println("Antes INPUTSTREAM");
        InputStream is = urlConection.getInputStream();
        System.out.println("Despues INPUTSTREAM");
        System.out.println("Antes leer fichero");
        File fichero = new File("gasuco.xml");
        FileOutputStream fos = new FileOutputStream(fichero);
        byte[] bytes = new byte[1024];
        int leidos;
        while ((leidos = is.read(bytes)) != -1){
            fos.write(bytes, 0, leidos);
        }
        fos.close();
        is.close();


     }

}


Y la del TrustManager:

Código (java) [Seleccionar]


public class SimpleTrustManager1 implements X509TrustManager   {

    private Set<X509Certificate> certs = new HashSet<X509Certificate>();


    public SimpleTrustManager1() throws Exception {
      //Cargamos los certificados del Keystore en el atributo certs
   }

   public void checkClientTrusted(X509Certificate[] chain, String authType)
      throws CertificateException {
   }

   public X509Certificate[] getAcceptedIssuers() {
     return certs.toArray(new X509Certificate[certs.size()]);
   }

   public void checkServerTrusted(X509Certificate[] chain, String authType)
      throws CertificateException {

      for(int i=0; i<chain.length; i++){
         if(certs.contains(chain[i])){
            return;
         }
      }

      int x =JOptionPane.showConfirmDialog(null, "El servidor "+chain[0].getIssuerDN()+
         " no se puede verificar. " +
         "¿Desde realizar la conexión de todas formas?", "TITULO", JOptionPane.YES_NO_OPTION);

      if(x==JOptionPane.OK_OPTION){
         
          //throw new CertificateException("La clave no está en el trustore");
      }
}


Me salta la excepcion:

Exception in thread "main" java.io.IOException: HTTPS hostname wrong:  should be <192.168.2.2>
        at sun.net.www.protocol.https.HttpsClient.checkURLSpoofing(HttpsClient.java:524)
        at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:448)
        at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166)
        at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:133)
        at conexionHTTPS.Https.main(Https.java:45)

Alguien me puede guiar en como corregir dicho error???

Saludos.

alzehimer_cerebral
Servicios Informaticos Valencia - www.ag-solutions.es
Mi blog - www.alvarogarciasolano.com

Debci

Como que debes quitarle el https:// se supone que ya es seguro que es https no?

:)

Saludos

alzehimer_cerebral

#2
Eso no es porque a la hora de crear una URL hay que indicar el protocolo.  :P Ademas el connect es el que lanza la excepcion, tambien la lanza el getInputStream si comento la linea del connect!  Yo diria que una mala gestion de la clase SimpleTrustManager1 lanza la excepcion ya que el constructor realmente no esta haciendo nada, alguien sabe como podria cargar el keystore que tiene cada cliente en su maquina en la variable certs???

Aclaracion: la aplicacion se conecta a un servidor cuyo certificado X.509 es autofirmado (no esta dado de alta en las empresas que los validan).  Por lo tanto cuando la aplicacion haga una conexion al servidor deberia saltar un mensaje para confirmar si se confia en la autoridad del certificado, al dar en que si se confia no se exactamente que es lo que se debe hacer, se podria iniciar la descarga sin mas o se deberia añadir el certificado al keystore del cliente para que en un futuro no salte el mensaje de confianza???

Haber si alguien me ayuda a aclarar la parte teorica para poder proseguir con la implementacion, ya que no me queda claro el proceso a seguir..

Cualquier opinion o experiencia es bienvenida.

Salu2.

alzehimer_cerebral
Servicios Informaticos Valencia - www.ag-solutions.es
Mi blog - www.alvarogarciasolano.com

Leyer

#3
Usaste el HostnameVerifier y lo usaste por defecto en HttpsURLConnection.setDefaultHostnameVerifier()?

funciona en otras https seguramente tengas que configurar el tomcat

http://forums.sun.com/thread.jspa?threadID=620276&messageID=3514309