Conectar atraves de um PROXY, o que estou fazendo de errado?

pessoal

Peguei dicas pelos foruns javas e cheguei a esse codigo (eh auto-condido, dah para compilar no [color=red]JAVA 1.3[/color] que eh meu objetivo).
Ja tentei varias coisas que vi no GUJ e em outros foruns, mas ate agora nao consegui resolver.

No entando ao rodar recebo a seguinte mensagem de erro:

Unable to tunnel through MY_PROXY_ADDRESS:8080. Proxy returns “HTTP/1.1 407 Proxy Authentication Required ( The ISA Server requires authorization to fulfill the request. Access to the Web Proxy service is denied. )”

[code]package ssltest;

import java.io.;
import java.net.
;
import java.security.cert.X509Certificate;

import com.sun.net.ssl.SSLContext;
import com.sun.net.ssl.TrustManager;
import com.sun.net.ssl.X509TrustManager;
import com.sun.net.ssl.internal.www.protocol.https.BASE64Encoder;
import com.sun.net.ssl.internal.www.protocol.https.HttpsURLConnection;

/**
*

  • @author pen_fold
    */
    public class SSLTest {

    /**

    private void testConnection(String strUrl) {

     String strProxyUsername = "MY_DOMAIN\\MY_USER";
     String strProxyPassword = "MY_PASSWORD";
     String strProxyHost = "MY_PROXY_ADDRESS";
     String strProxyPort = "8080";
    
     //set up system properties to indicate we are using a proxy
     System.setProperty("https.proxyHost", strProxyHost);
     System.setProperty("https.proxyPort", strProxyPort);
     System.setProperty("proxyHost", strProxyHost);
     System.setProperty("proxyPort", strProxyPort);
     System.setProperty("proxySet", "true");
     System.setProperty("http.proxyHost", strProxyHost);
     System.setProperty("http.proxyPort", strProxyPort);
     System.setProperty("http.proxySet", "true");                       
    
     String strUserpass = strProxyUsername + ":" + strProxyPassword;  
    
     System.setProperty ("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol") ; //add https protocol handler 
     java.security.Security.addProvider ( new com.sun.net.ssl.internal.ssl.Provider( )) ; //dynamic registration of SunJSSE provider  
    
     TrustManager[] arrTrustAllCerts = new TrustManager[] { 
         new X509TrustManager() {  
             public java.security.cert.X509Certificate[] getAcceptedIssuers() {  
                 return null;  
             }  
    
             public void checkClientTrusted(  
                 java.security.cert.X509Certificate[] certs, String authType) {}  
    
             public void checkServerTrusted(  
                 java.security.cert.X509Certificate[] certs, String authType) {}
    
             public boolean isClientTrusted(X509Certificate[] arg0) {
                 // TODO Auto-generated method stub
                 return true;
             }
    
             public boolean isServerTrusted(X509Certificate[] arg0) {
                 // TODO Auto-generated method stub
                 return true;
             }  
         }
     };  
    
     SSLContext objSSLContext;  
    
     try {  
         objSSLContext = SSLContext.getInstance("SSL");  
         objSSLContext.init(null, arrTrustAllCerts, new java.security.SecureRandom());  
         HttpsURLConnection.setDefaultSSLSocketFactory(objSSLContext.getSocketFactory());  
    
         //URLConnection con = url.openConnection();  
         String encodedLogin = new BASE64Encoder().encode(strUserpass.getBytes());
    
         URL objUrl = new URL(strUrl);  
         HttpURLConnection objConnection = (HttpURLConnection) objUrl.openConnection();
         objConnection.setDoOutput(true);                                                                 
         objConnection.setRequestProperty("Proxy-Authorization", "Basic " + encodedLogin);                          
         objConnection.connect();                                
    
         BufferedReader objBufferReader = new BufferedReader(new InputStreamReader(objConnection.getInputStream()));
         String strResponse = objBufferReader.readLine();
         if (strResponse != null)
                 strResponse = strResponse.trim();			
    
         objConnection.disconnect();
    
     }catch(UnknownHostException UHex) 
     {
         System.out.println("UnknownHostException: " + UHex.getMessage());
    
     }catch(Exception ex) 
     {
         System.out.println("Error: " + ex.getMessage());
     }
    

    }
    }[/code]

Inicialmente meu problema era com SSL (no Java 1.3), mas agora estou com esse problema para testar, pois aqui na empresa estamos atras de um proxy Microsoft.

Se alguem puder ajudar ficarei agradecido.

Abracos

Alguem?

Esse eho codigo mais recente do teste (Agora roda no WebSphere 5, faz usos da biblioteca JSSE da IBM). Onde tem acesso direto funciona OK, mas nao consigo atravessar o PROXY.

[code]import com.ibm.misc.BASE64Encoder;
import java.io.;
import java.net.
;
import java.security.cert.X509Certificate;

import com.ibm.net.ssl.SSLContext;
import com.ibm.net.ssl.TrustManager;
import com.ibm.net.ssl.X509TrustManager;
import com.ibm.net.ssl.internal.www.protocol.https.HttpsURLConnection;

/**
*

  • @author pen_fold
    */
    public class SSLTest {

    /**

    private void testConnection(String strUrl) {

     String strDebug = "";
     String strProxyUsername = "MY_DOMAIN\\MY_USER";  
     String strProxyPassword = "MY_PASSWORD";  
     String strProxyHost = "MY_PROXY_ADDRESS";  
     String strProxyPort = "8080";
    
     //set up system properties to indicate we are using a proxy
     System.setProperty("https.proxyHost", strProxyHost);
     System.setProperty("https.proxyPort", strProxyPort);
     System.setProperty("https.proxySet", "true");
     System.setProperty("proxyHost", strProxyHost);
     System.setProperty("proxyPort", strProxyPort);
     System.setProperty("proxySet", "true");
     System.setProperty("http.proxyHost", strProxyHost);
     System.setProperty("http.proxyPort", strProxyPort);
     System.setProperty("http.proxySet", "true");                       
    
     String strUserpass = strProxyUsername + ":" + strProxyPassword; 
    
     strDebug += "Starting OK\n";
     
     System.setProperty ("java.protocol.handler.pkgs", "com.ibm.net.ssl.internal.www.protocol") ; //add https protocol handler 
     java.security.Security.addProvider ( new com.ibm.jsse.JSSEProvider()) ; //dynamic registration of IBMJSSE provider  
     
     strDebug += "Provider OK\n";
     
     TrustManager[] arrTrustAllCerts = new TrustManager[] { 
         new X509TrustManager() {  
             public java.security.cert.X509Certificate[] getAcceptedIssuers() {  
                 return null;  
             }  
    
             public void checkClientTrusted(  
                 java.security.cert.X509Certificate[] certs, String authType) {}  
    
             public void checkServerTrusted(  
                 java.security.cert.X509Certificate[] certs, String authType) {}
    
             public boolean isClientTrusted(X509Certificate[] arg0) {
                 // TODO Auto-generated method stub
                 return true;
             }
    
             public boolean isServerTrusted(X509Certificate[] arg0) {
                 // TODO Auto-generated method stub
                 return true;
             }  
         }
     };  
    
     strDebug += "Certificates OK\n";
     
     SSLContext objSSLContext;  
    
     try {  
         objSSLContext = SSLContext.getInstance("SSL");  
         objSSLContext.init(null, arrTrustAllCerts, new java.security.SecureRandom());  
         HttpsURLConnection.setDefaultSSLSocketFactory(objSSLContext.getSocketFactory());  
    
         //URLConnection con = url.openConnection();  
         String encodedLogin = new BASE64Encoder().encode(strUserpass.getBytes());
         
         strDebug += "SSL OK\n";
    
         URL objUrl = new URL(strUrl);  
         HttpURLConnection objConnection = (HttpURLConnection) objUrl.openConnection();
         objConnection.setDoOutput(true);                                                                 
    
         objConnection.connect();   [color=red]//Do I need that???  [/color]                           
         objConnection.setRequestProperty("Proxy-Authorization", "Basic " + encodedLogin);                          
         objConnection.setRequestProperty("Authorization", "Basic " + encodedLogin);
         objConnection.setRequestProperty("Https-Proxy-Authorization", "Basic " + encodedLogin);
         
         strDebug += "Connection OK\n";
         
         BufferedReader objBufferReader = new BufferedReader(new InputStreamReader(objConnection.getInputStream()));
         
         String strResponse = null;
         while ((strResponse = objBufferReader.readLine()) != null)
             System.out.println(strResponse);
    
         objConnection.disconnect();
         
         strDebug += "Disconnection OK\n";
    
     }catch(UnknownHostException UHex) 
     {
         UHex.printStackTrace();
         System.out.println("UnknownHostException: " + UHex);
    
     }catch(Exception ex) 
     {
         ex.printStackTrace();
         System.out.println("Error: " + ex);
     }finally {            
         System.out.println(strDebug);
     }
    

    }
    }[/code]

A exceção continua a mesma.

Unable to tunnel through MY_PROXY_ADDRESS:8080. Proxy returns “HTTP/1.1 407 Proxy Authentication Required ( The ISA Server requires authorization to fulfill the request. Access to the Web Proxy service is denied. )”

Obrigado

Olá,

Olha isso aqui direito…

[code]# private void testConnection(String strUrl) {

String strProxyUsername = “MY_DOMAIN\MY_USER”;

String strProxyPassword = “MY_PASSWORD”;

String strProxyHost = “MY_PROXY_ADDRESS”;

String strProxyPort = “8080”; [/code]

Obrigado por ajudar.

Mas eu mudei os dados para colocar no FORUM, claro que nos testes eu coloco os dados validos.

Alguem sabe o que poderia ser?

O Proxy é Microsoft.

Obrigado

Olá,

Eu também já tive que implementar uma chamada HTTP através de Proxy, mas faz bastante tempo e eu não lembro de muita coisa, então infelizmente não posso ajudar tanto assim. Mas tenho algumas pequenas dicas:

  • Primeiro, instale um Sniffer HTTP em sua máquina (por exemplo, Http View ou a extensão do Firefox LiveHttp)

  • Observe a conversação que acontece quando você acessa o site através do Browser:
    [color=blue]Normalmente o servidor manda uma resposta “Proxy Authentication Required” contendo o header Proxy-Authenticate. Este header contém instruções para o cliente, por exemplo o tipo de autenticação suportado e/ou uma chave a ser usada na criptografia da senha (dependendo do tipo de autenticação)
    O cliente então repete a requisição, dessa vez preenchendo o header Proxy-Authorization. Agora sim ocorre a resposta “200-OK”[/color]

  • Compare com o que a sua aplicação está fazendo, verifique se não falta nenhum header, se o tipo de autenticação está de acordo com o solicitado pelo servidor, etc.

O Java só consegue falar corretamente com um proxy da Microsoft a partir da versão 6.0. Fatos da vida…

Para versões anteriores, eu recomendaria usar uma de duas gambiarras:

  • Usar um “proxy de proxy”, que efetue essa autenticação - é o que normalmente faço, para não alterar o ambiente. Procure por “NTLM Authorization Proxy Server”, que é um programa escrito em Python. Para rodar o Python em Windows, você pode baixar a versão da ActiveState, que é gratuita.
  • Solicitar ao pessoal de suporte de sua rede que instale o Proxy Client na sua máquina - instalando esse programa, você não precisa se autenticar no proxy e os programas se conectam “transparentemente” à Internet. Acho que essa segunda via é um pouco mais difícil de conseguir (nunca vi um cliente que fizesse isso).