GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Connecar uma URL via Https com autenticção em proxy de saida

Bom galera eh o seguinte, preciso me connectar a uma URL com protocolo Https, “https://www.sitequalquer.com.br” soh q para me conectar a ela tenho q autenticar no meu proxy saida.
Para me conectar a URL com protocolo http eu consegui criando um socket, logo pensei em usar a mesma classe alterar para q se comunique com HTTPS, pesquisei um pouco e mudei alguns parametros agora esta com um erro q eu não sei mais oq fazer se alguem puder dar uma olhada…

[code]public class ConnectURLHTTPS
{

private String page;
private BufferedWriter bw;


ConnectURLHTTPS(String url)
{
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
System.setProperty("java.protocol.handler.pkgs","com.sun.net.ssl.internal.www.protocol");        
	
	try
	{
		page = "";
	
		String line = "",
			   proxy = "myproxy",
		       port = "80",
		       authentication = "myusername:mypwd";
		       
		URL server = new URL(url);
		System.out.println("url destino");
	
        // Connect to the server using an SSL socket
        SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault();
        SSLSocket socket = (SSLSocket) factory.createSocket(proxy,Integer.parseInt(port));
		System.out.println("socket criado");
		//Socket socket = new Socket(proxy,Integer.parseInt(port));
		Writer writer = new OutputStreamWriter(socket.getOutputStream(),"US-ASCII");
		writer.write("GET " + server.toExternalForm() + " HTTP/1.1

");
writer.write("Host: " + server.getHost() + ":80
");
writer.write("User-Agent: Java HTTPS Client");
writer.write("Proxy-Authorization: Basic "+ new sun.misc.BASE64Encoder().encode(authentication.getBytes())+ "

");
writer.flush();
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(),"US-ASCII"));

		line = reader.readLine();
		 
		while (line != null)
		{
			page += line + "

";
line = reader.readLine();
}
System.out.println(page);

		reader.close();
		writer.close();
		socket.close();
	
	}
	catch(Exception e)
	{
		System.out.println(e);
	}
}

public static void main(String args[])
{
ConnectURLHTTPS cn = new ConnectURLHTTPS(https://www.sitequalquer.com.br);
}[/code]

o erro q esta retornando eh esse:

[quote]
Exception in thread “main” javax.net.ssl.SSLHandshakeException: Remote host clos
ed connection during handshake
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.a(DashoA6275)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.j(DashoA6275)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(DashoA6275)

    at SSLSocketClient.main(SSLSocketClient.java:48 )

Caused by: java.io.EOFException: SSL peer shut down incorrectly
at com.sun.net.ssl.internal.ssl.InputRecord.read(DashoA6275)
… 4 more[/quote]

se alguem souber resolver me ajude por favor

:wink:

:frowning: :frowning: ninguém?!?!?

bom, alguem pelo menos sabe me explicar como funciona a requisição de endereço no protocolo https??

eu tenho q alem de autenticar no proxy atraves do socket me autenticar no Host da pagina?

Olá

Olhando seu código a primeira vista e vendo a variável line sendo inicializada de forma meio estranha, senti falta de definição de variáveis que aparecem no JSSE Ref. Guide tais como:System.setProperty("https.proxyHost", "myproxy"); System.setProperty("https.proxyPort", 80);oujava -Dhttps.proxyHost=myproxy -Dhttps.proxyPort=80 appJava
Mas lendo alguma coisa nos links abaixo que vou sugerir vi que algo mais precisará ser feito.

O protocolo HTTPS interage duramente com proxies. Com HTTPS o proxy não vê nem a URL e nem os dados. A semântica HTTPS implica em que o cliente negocie uma sessão SSL com o servidor que se quer falar. Uma vez feito isto, todos os dados que passam entre o cliente e o servidor são encriptados. O resultado é que os proxies que fazem cache para aumentar a performance da rede interna não funcionam.

Um problema mais sério é que a semântica usual HTTP dos proxies não funciona com HTTPS. O proxy examina a requisição do cliente para determinra em qual servidor deve se conectar. HTTPS exige que a requisição já venha encriptada e então o caminho usual não é possível. Foi então desenvolvido um novo método proxy CONNECT (RFC2817) que instrui ao proxy para iniciar a conexão TCP com o servidor remoto sem examinar nem mudar nada. O cliente então transmite os dados SSL para o proxy como se este fosse o servidor remoto. Resumindo, é como se fosse uma espécie de gambiarra, mas funciona.

Links específicos sobre HTTPS x Proxy:
Java Tip 111: Implement HTTPS tunneling with JSSE

Java Developer Forums Topic: Proxy authorization failed using HTTPS connections

Java Developer Forums Topic: Proxy authentication doesn’t work with JSSE

Links sobre JSSE que você precisa ver:
JavaTM Secure Socket Extension (JSSE) - Reference Guide

JavaOne 2003 - JSSE Software: Tips, Tricks, and Q&A

jakarta-commons-HttpClient (A versão 2.1 vai funcionar OK com proxies)

The grinder (Só para ter idéias)

Links adicionais para quem quiser saber sobre o que se está falando:
Security Java Secure Socket Extension (JSSE)

Secure Your Sockets with JSSE

[]s
Luca

Eu estou com um problema, tenho um código igual a esse seu de socket fazendo http em uma URL via Get ?arg1=valor&arg2=valor2

Rodando no Ambiente Windows esta funcionando, mas quando rodo no linux nçao funciona, fica travado esperando a resposta do site,para sair do programa java, preciso dar um “crtl + c” .

alguém ja teve esse tipo de problema ???
será que é alguma configuração de firewall no linux…eu ja desabilitei e nada de funcionar…
estou com Mandrake 9.2.

Estou precisando de ajuda urgente… valeu…
Fico no Aguardo.

ld50, não sei se vou consegui resolver o seu problema, mas eu também estava precisado acessar um site via URL com proxy e fiz da seguinte forma:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Authenticator;
import java.net.InetSocketAddress;
import java.net.MalformedURLException;
import java.net.Proxy;
import java.net.URL;
import java.net.URLConnection;
import java.net.Proxy.Type;

public class CatchHTML {

	public static void main(String[] args) {
		
		URL url;
		
		try {
			
			
			url = new URL("http://www.guj.com.br/");
			
			Authenticator.setDefault(new ProxyAuthenticator("zell", "zell"));
			
			//No InetSocketAddress deve passar como parâmetro o host e porta do proxy.
			Proxy proxy = new Proxy(Type.HTTP, new InetSocketAddress("192.168.7.105", 3128));
			
			
			URLConnection urlConn;
			if (proxy != null) {
				System.out.println("Created proxy: " + proxy.address());
				urlConn = url.openConnection(proxy);
			} else {
				urlConn = url.openConnection();
			}
			
			InputStreamReader imputStream = new InputStreamReader(urlConn.getInputStream());
			BufferedReader bufferReader = new BufferedReader(imputStream);
			String line = "";
			while ((line = bufferReader.readLine()) != null) {

				System.out.println(line);

			}
			
			
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

E para a autenticação eu fiz essa classe aqui:


import java.net.Authenticator;
import java.net.PasswordAuthentication;

public class ProxyAuthenticator extends Authenticator {

	private String user, password;

	public ProxyAuthenticator(String user, String password) {
		this.user = user;
		this.password = password;
	}

	protected PasswordAuthentication getPasswordAuthentication() {
		return new PasswordAuthentication(user, password.toCharArray());
	}

}
Espero ter ajudado.

Abraço!
//