Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > [Duda] Proxy HTTPS

Hola que tal, tengo en java un proxy que soporta peticiones HTTP... El cliente se conecta al proxy y desde el programa puedo limitarle el ancho de banda, paginas webs ETC. El problema pasa cuando el cliente ingresa una web tipos HTTPS (como google), el proxy no escribe al cliente.
La verdad lei un monton sobre este protocolo e hice muchas pruebas en las que incluyen certificados, stores (keystore y truststore) pero no hay caso, no me deja enviarle datos al cliente.

Alguna sugerencia?

octubre 25, 2013 | Unregistered CommenterWaresz

Buenas,

Mi sugerencia es que, ademas de decirnos QUE hace tu proxy nos digas COMO funciona tu proxy (si pones ejemplos del codigo mejor)
Tambien deberias decirnos que has intentado hacer tras tu intensivo estudio del protocolo hasta ahora (el codigo tambien ayuda aqui).

Sin esa informacion es imposible sugerir otra cosa para ayudarte.

Un saludo,

octubre 25, 2013 | Unregistered CommenterUnoPorAhi

Gracias por tu ayuda, mira las pruebas que hice hasta ahora (Para conexión ssl) son las siguiente:

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author Waresz
*/
public class SSL {
private Socket cliente;

public SSL() {
try {
//SSLServerSocket servidor = setupSSLServerSocket();
ServerSocket servidor = new ServerSocket(8080);
// SSLSocket cliente = (SSLSocket) servidor.accept();
cliente = servidor.accept();
System.out.println(cliente.getInetAddress().getHostAddress()+":"+cliente.getPort());
SSLSocket url = setupSSLClientSocket();
System.out.println(url.getSession().getPeerCertificates()[0]);

url.getOutputStream().write("...Hola?".getBytes());
url.getOutputStream().flush();
url.getOutputStream().close();
} catch (IOException ex) {
Logger.getLogger(SSL.class.getName()).log(Level.SEVERE, null, ex);
}
}


private SSLSocket setupSSLClientSocket() {


try {
TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}

@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {
}

@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {
}
}
};


SSLContext sc = SSLContext.getInstance("TLSv1");

sc.init(null, trustAllCerts, new java.security.SecureRandom());

SSLSocketFactory f = sc.getSocketFactory();

SSLSocket sslSocket = (SSLSocket) f.createSocket(cliente,cliente.getInetAddress().getHostAddress(), cliente.getPort(), true);

return sslSocket;

} catch (IOException ex) {
} catch (KeyManagementException e) {
} catch (NoSuchAlgorithmException e) {
}


return null;
}

}

- En el codigo de ejemplo lo que intento es que cuando un cliente https se conecta (por ejemplo entran a google) le envie una respuesta.
El error que sale es el siguiente :"javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated".

Lo raro es que si se cambia la linea

SSLSocket sslSocket = (SSLSocket) f.createSocket(cliente,cliente.getInetAddress().getHostAddress(), cliente.getPort(), true);

Por: SSLSocket sslSocket = (SSLSocket) f.createSocket("www.google.com",443);

me deja entrar a google y escribir, tendria que hacer lo mismo pero con el cliente.


---------------------------------- xx ---------------------------------------

- Mi proxy funciona de la siguiente manera (la verdad es mucho codigo prefiero explicarlo): Es un ServerSocket el cual cada ves que se conecta un cliente http lee sus encabezados y los analiza (verifica si son http 1.1/1.0 para conexion keep). Una ves que leyó encabezados envia la respuesta.
Lo que le falta es hacer lo mismo pero con https.

Saludos!

octubre 25, 2013 | Unregistered CommenterWaresz

Buenas,

Es extrano porque parece que lo estas haciendo bien y no deberia hacer la verificacion....

Que te devuelve System.out.println(cliente.getInetAddress().getHostAddress()+":"+cliente.getPort());?

www.google.com:443?

Un saludo

octubre 25, 2013 | Unregistered CommenterUnoPorAhi

Nuevamente, gracias por la ayuda.

- Nono, me devuelve "192.168.1.101:49387" (es el cliente local que se conecto) .La URL puedo escribirla (google en este caso), pero al cliente no.
Digamos que se conecta un cliente a mi proxy (por ejemplo desde el navegador chrome o cualquier otro), entra a una pagina https y le quiero poner un X mensaje (por ejemplo "hola").

octubre 25, 2013 | Unregistered CommenterWaresz

Hola Waresz,

una duda xD, donde se inicia el cifrado de ssl? en el cliente o en el proxy? porque si fuera en el proxy este tendria la oportunidad de modificar la respuesta y agregar un javascript, con un mensaje por ejemplo no?

Estaría interesante ver ese proxy en java xD.

Saludos

octubre 25, 2013 | Unregistered Commenterpr0kd