On Tue, Jun 14, 2005 at 07:22:07PM +0800, pavan kumar wrote:
> Hi Oleg, 
> 
> I am using Sun's default provider.
> I have a sample code that does http tunnelling with basic auth, Can you 
> please help me where to make changes so that it does NTLM auth and https 
> tunnelling. I am learning NTLM a lot these days.
> 
> I am sending the sample code too.
> 

Please do not send any code that has nothing to do with HttpClient. This
is not a Microsoft / Sun support forum

Thank you

Oleg


> many many thanks 
> Pavan
> 
> ----- Original Message -----
> From: "Oleg Kalnichevski" <[EMAIL PROTECTED]>
> To: "HttpClient User Discussion" <[email protected]>
> Subject: Re: https tunnelling with NTLM+Proxy
> Date: Tue, 14 Jun 2005 10:51:11 +0200
> 
> > 
> > On Tue, Jun 14, 2005 at 03:35:54PM +0800, pavan kumar wrote:
> > > Hi All,
> > >
> > >
> > > Does Apache's HttpClient 3.0 support Https Tunnelling over Proxy 
> > > with NTLM. ( I am using MSProxy2.0 on win2k server).
> > >
> > 
> > Yes, it does
> > 
> > 
> > > Can some one throw light on that?
> > > Is jdk1.3 compatibale with Apache's HttpClient 3.0
> > >
> > 
> > What provider? IBM? Sun? HttpClient is compatible with Java 1.2 or
> > above. However, Sun JSSE 1.0.3 is known to have problems, so it is
> > highly recommended to upgrade to Java 1.4 when using SSL
> > 
> > http://jakarta.apache.org/commons/httpclient/3.0/sslguide.html#Known%20limitations%20and%20problems
> > 
> > Hope this helps
> > 
> > Oleg
> > 
> > 
> > > Thanks in advance Pavan
> > >
> > >
> > > -- _______________________________________________
> > > Get your free email from http://www.dellmail.com
> > >
> > >
> > >
> > >
> > > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > > For additional commands, e-mail: [EMAIL PROTECTED]
> > >
> > 
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> 

> import java.net.*;
> import java.io.*;
> import java.security.*;
> import sun.misc.BASE64Encoder;
> import javax.net.*;
> import javax.net.ssl.*;
> 
> /*
>  *  This example is based on JavaWorld Tip 111. Thanks to Pua Yeow Cheong for 
> writing it.
>  *  It tunnels through a proxy using the Https protocol.
>  *  Thanks go to David Lord in the java forums for figuring out the main 
> problem with Tip 111
>  *  PLEASE NOTE: You need to have the JSSE 1.0.2 jars installed for this to 
> work
>  */
> /**
>  *  Downloads contents of a URL, using Proxy Tunneling and Basic 
> Authentication
>  */
> public class URLReader {
>     /**
>      *  The main program for the URLReader class
>      */
>     public static void main(String[] args) throws Exception {
>         //set up strings for use in app. Change these to your own settings
>         String proxyPassword ="chn_Kjagad";
>         String proxyUsername = "password123";
>         String proxyHost = "10.132.58.182";
>         String proxyPort = "80";
>         String connectionURL = "https://www.verisign.com";;
> 
>         //set up system properties to indicate we are using a proxy
>         System.setProperty("https.proxyHost", proxyHost);
>         System.setProperty("https.proxyPort", proxyPort);
>         System.setProperty("proxyHost", proxyHost);
>         System.setProperty("proxyPort", proxyPort);
>         System.setProperty("proxySet", "true");
>         System.setProperty("http.proxyHost", proxyHost);
>         System.setProperty("http.proxyPort", proxyPort);
>         System.setProperty("http.proxySet", "true");
> 
>         //set up handler for jsse
>         System.setProperty("java.protocol.handler.pkgs", 
> "com.sun.net.ssl.internal.www.protocol");
>         java.security.Provider prov = new 
> com.sun.net.ssl.internal.ssl.Provider();
>         Security.addProvider(prov);
>         //create the connection
> //        URL myURL = new URL(connectionURL);
> URL myURL = new URL(null,connectionURL,new 
> com.sun.net.ssl.internal.www.protocol.https.Handler());
> 
>         URLConnection myConnection = myURL.openConnection();
>         if (myConnection instanceof com.sun.net.ssl.HttpsURLConnection) {
>             ((com.sun.net.ssl.HttpsURLConnection) 
> myConnection).setSSLSocketFactory(new 
> SSLTunnelSocketFactory(System.getProperty("proxyHost"), 
> System.getProperty("proxyPort")));
>         }
>         myConnection.setDoInput(true);
>         myConnection.setDoOutput(true);
>         BufferedReader in;
>         try {
>             System.err.println("opening Input stream1");
>             in = new BufferedReader(
>                     new InputStreamReader(
>                     myConnection.getInputStream()));
>             String inputLine;
>             System.err.println("Input stream is Open1");
>             while ((inputLine = in.readLine()) != null) {
>                 System.err.println(inputLine);
>             }
>             in.close();
>             System.err.println("Input stream is Closed1");
>         } catch (Exception e) {
>             e.printStackTrace(System.err);
>             String tmp = e.getMessage().toLowerCase().trim();
>             System.err.println("tmp *" + tmp + "*");
>             if (tmp.indexOf("http") > -1) {
>                 //http error message to be parsed
> 
>                 tmp = tmp.substring(tmp.indexOf("http")).trim();
>                 System.err.println("tmp *" + tmp + "*");
>                 tmp = tmp.substring(8).trim();
>                 System.err.println("tmp *" + tmp + "*");
>                 if (tmp.startsWith("407")) {
>                     //proxy authentication required
> 
>                     myURL = new URL(connectionURL);
>                     myConnection = myURL.openConnection();
>                     if (myConnection instanceof 
> com.sun.net.ssl.HttpsURLConnection) {
>                         ((com.sun.net.ssl.HttpsURLConnection) 
> myConnection).setSSLSocketFactory(new 
> SSLTunnelSocketFactory(System.getProperty("proxyHost"), 
> System.getProperty("proxyPort"), proxyUsername, proxyPassword));
>                     }
>                     myConnection.setDoInput(true);
>                     myConnection.setDoOutput(true);
> 
>                     try {
>                         System.err.println("opening Input stream 2");
>                         in = new BufferedReader(
>                                 new InputStreamReader(
>                                 myConnection.getInputStream()));
>                         String inputLine;
>                         System.err.println("Input stream is Open 2");
> 
>                         while ((inputLine = in.readLine()) != null) {
>                             System.out.println(inputLine);
>                         }
>                         in.close();
>                         System.err.println("Input stream is closed 2");
>                     } catch (Exception ex) {
>                         System.err.println(ex.getMessage());
>                         ex.printStackTrace(System.err);
>                     }
>                 }
>             }
>         }
>     }
> 
> }
> 
> /**
>  *  SSLSocket used to tunnel through a proxy
>  */
> class SSLTunnelSocketFactory extends SSLSocketFactory {
> 
> 
>     private String tunnelHost;
>     private int tunnelPort;
>     private SSLSocketFactory dfactory;
>     private String tunnelPassword;
>     private String tunnelUserName;
>     private boolean socketConnected = false;
>     private int falsecount = 0;
> 
> 
>     /**
>      *  Constructor for the SSLTunnelSocketFactory object
>      *
>      [EMAIL PROTECTED]  proxyHost  The url of the proxy host
>      [EMAIL PROTECTED]  proxyPort  the port of the proxy
>      */
>     public SSLTunnelSocketFactory(String proxyHost, String proxyPort) {
>         System.err.println("creating Socket Factory");
>         tunnelHost = proxyHost;
>         tunnelPort = Integer.parseInt(proxyPort);
>         dfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
>     }
> 
> 
>     /**
>      *  Constructor for the SSLTunnelSocketFactory object
>      *
>      [EMAIL PROTECTED]  proxyHost      The url of the proxy host
>      [EMAIL PROTECTED]  proxyPort      the port of the proxy
>      [EMAIL PROTECTED]  proxyUserName  username for authenticating with the 
> proxy
>      [EMAIL PROTECTED]  proxyPassword  password for authenticating with the 
> proxy
>      */
>     public SSLTunnelSocketFactory(String proxyHost, String proxyPort, String 
> proxyUserName, String proxyPassword) {
>         System.err.println("creating Socket Factory with password/username");
>         tunnelHost = proxyHost;
>         tunnelPort = Integer.parseInt(proxyPort);
>         tunnelUserName = proxyUserName;
>         tunnelPassword = proxyPassword;
>         dfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
>     }
> 
> 
>     /**
>      *  Sets the proxyUserName attribute of the SSLTunnelSocketFactory object
>      *
>      [EMAIL PROTECTED]  proxyUserName  The new proxyUserName value
>      */
>     public void setProxyUserName(String proxyUserName) {
>         tunnelUserName = proxyUserName;
>     }
> 
> 
>     /**
>      *  Sets the proxyPassword attribute of the SSLTunnelSocketFactory object
>      *
>      [EMAIL PROTECTED]  proxyPassword  The new proxyPassword value
>      */
>     public void setProxyPassword(String proxyPassword) {
>         tunnelPassword = proxyPassword;
>     }
> 
> 
>     /**
>      *  Gets the supportedCipherSuites attribute of the SSLTunnelSocketFactory
>      *  object
>      *
>      [EMAIL PROTECTED]    The supportedCipherSuites value
>      */
>     public String[] getSupportedCipherSuites() {
>         return dfactory.getSupportedCipherSuites();
>     }
> 
> 
>     /**
>      *  Gets the defaultCipherSuites attribute of the SSLTunnelSocketFactory
>      *  object
>      *
>      [EMAIL PROTECTED]    The defaultCipherSuites value
>      */
>     public String[] getDefaultCipherSuites() {
>         return dfactory.getDefaultCipherSuites();
>     }
> 
> 
>     /**
>      *  Gets the socketConnected attribute of the SSLTunnelSocketFactory 
> object
>      *
>      [EMAIL PROTECTED]    The socketConnected value
>      */
>     public synchronized boolean getSocketConnected() {
>         return socketConnected;
>     }
> 
> 
>     /**
>      *  Creates a new SSL Tunneled Socket
>      *
>      [EMAIL PROTECTED]  s                         Ignored
>      [EMAIL PROTECTED]  host                      destination host
>      [EMAIL PROTECTED]  port                      destination port
>      [EMAIL PROTECTED]  autoClose                 wether to close the socket 
> automaticly
>      [EMAIL PROTECTED]                           proxy tunneled socket
>      [EMAIL PROTECTED]  IOException           raised by an IO error
>      [EMAIL PROTECTED]  UnknownHostException  raised when the host is unknown
>      */
>     public Socket createSocket(Socket s, String host, int port, boolean 
> autoClose)
>              throws IOException, UnknownHostException {
>         Socket tunnel = new Socket(tunnelHost, tunnelPort);
>         doTunnelHandshake(tunnel, host, port);
>         SSLSocket result = (SSLSocket) dfactory.createSocket(tunnel, host, 
> port, autoClose);
>         result.addHandshakeCompletedListener(
>             new HandshakeCompletedListener() {
>                 public void handshakeCompleted(HandshakeCompletedEvent event) 
> {
>                     System.out.println("Handshake Finished!");
>                     System.out.println("\t CipherSuite :" + 
> event.getCipherSuite());
>                     System.out.println("\t SessionId: " + event.getSession());
>                     System.out.println("\t PeerHost: " + 
> event.getSession().getPeerHost());
>                     setSocketConnected(true);
>                 }
>             });
>         // thanks to David Lord in the java forums for figuring out this line 
> is the problem
>         // result.startHandshake(); //this line is the bug which stops Tip111 
> from working correctly
>         return result;
>     }
> 
> 
>     /**
>      *  Creates a new SSL Tunneled Socket
>      *
>      [EMAIL PROTECTED]  host                      destination host
>      [EMAIL PROTECTED]  port                      destination port
>      [EMAIL PROTECTED]                           tunneled SSL Socket
>      [EMAIL PROTECTED]  IOException           raised by IO error
>      [EMAIL PROTECTED]  UnknownHostException  raised when the host is unknown
>      */
>     public Socket createSocket(String host, int port)
>              throws IOException, UnknownHostException {
>         return createSocket(null, host, port, true);
>     }
> 
> 
>     /**
>      *  Creates a new SSL Tunneled Socket
>      *
>      [EMAIL PROTECTED]  host                      Destination Host
>      [EMAIL PROTECTED]  port                      Destination Port
>      [EMAIL PROTECTED]  clientHost                Ignored
>      [EMAIL PROTECTED]  clientPort                Ignored
>      [EMAIL PROTECTED]                           SSL Tunneled Socket
>      [EMAIL PROTECTED]  IOException           Raised when IO error occurs
>      [EMAIL PROTECTED]  UnknownHostException  Raised when the destination 
> host is
>      *      unknown
>      */
>     public Socket createSocket(String host, int port, InetAddress clientHost,
>             int clientPort)
>              throws IOException, UnknownHostException {
>         return createSocket(null, host, port, true);
>     }
> 
> 
>     /**
>      *  Creates a new SSL Tunneled Socket
>      *
>      [EMAIL PROTECTED]  host             destination host
>      [EMAIL PROTECTED]  port             destination port
>      [EMAIL PROTECTED]                  tunneled SSL Socket
>      [EMAIL PROTECTED]  IOException  raised when IO error occurs
>      */
>     public Socket createSocket(InetAddress host, int port)
>              throws IOException {
>         return createSocket(null, host.getHostName(), port, true);
>     }
> 
> 
>     /**
>      *  Creates a new SSL Tunneled Socket
>      *
>      [EMAIL PROTECTED]  address          destination host
>      [EMAIL PROTECTED]  port             destination port
>      [EMAIL PROTECTED]  clientAddress    ignored
>      [EMAIL PROTECTED]  clientPort       ignored
>      [EMAIL PROTECTED]                  tunneled SSL Socket
>      [EMAIL PROTECTED]  IOException  raised when IO exception occurs
>      */
>     public Socket createSocket(InetAddress address, int port,
>             InetAddress clientAddress, int clientPort)
>              throws IOException {
>         return createSocket(null, address.getHostName(), port, true);
>     }
> 
> 
>     /**
>      *  Sets the socketConnected attribute of the SSLTunnelSocketFactory 
> object
>      *
>      [EMAIL PROTECTED]  b  The new socketConnected value
>      */
>     private synchronized void setSocketConnected(boolean b) {
>         socketConnected = b;
>     }
> 
> 
>     /**
>      *  Description of the Method
>      *
>      [EMAIL PROTECTED]  tunnel           tunnel socket
>      [EMAIL PROTECTED]  host             destination host
>      [EMAIL PROTECTED]  port             destination port
>      [EMAIL PROTECTED]  IOException  raised when an IO error occurs
>      */
>     private void doTunnelHandshake(Socket tunnel, String host, int port) 
> throws IOException {
>         OutputStream out = tunnel.getOutputStream();
>         //generate connection string
>         String msg = "CONNECT " + host + ":" + port + " HTTP/1.0\n"
>                  + "User-Agent: "
>                  + sun.net.www.protocol.http.HttpURLConnection.userAgent;
>         if (tunnelUserName != null && tunnelPassword != null) {
>             //add basic authentication header for the proxy
>             sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
>             String encodedPassword = enc.encode((tunnelUserName + ":" + 
> tunnelPassword).getBytes());
>             msg = msg + "\nProxy-Authorization: Basic " + encodedPassword;
>         }
>         msg = msg + "\nContent-Length: 0";
>         msg = msg + "\nPragma: no-cache";
> 
>         msg = msg + "\r\n\r\n";
> 
>         System.err.println(msg);
>         byte b[];
>         try {
>             //we really do want ASCII7 as the http protocol doesnt change 
> with locale
>             b = msg.getBytes("ASCII7");
>         } catch (UnsupportedEncodingException ignored) {
>             //If ASCII7 isn't there, something is seriously wrong!
>             b = msg.getBytes();
>         }
>         out.write(b);
>         out.flush();
> 
>         byte reply[] = new byte[200];
>         int replyLen = 0;
>         int newlinesSeen = 0;
>         boolean headerDone = false;
> 
>         InputStream in = tunnel.getInputStream();
>         boolean error = false;
> 
>         while (newlinesSeen < 2) {
>             int i = in.read();
> System.out.print((char)i);
>             if (i < 0) {
>                 throw new IOException("Unexpected EOF from Proxy");
>             }
>             if (i == '\n') {
>                 headerDone = true;
>                 ++newlinesSeen;
>             } else
>                     if (i != '\r') {
>                 newlinesSeen = 0;
>                 if (!headerDone && replyLen < reply.length) {
>                     reply[replyLen++] = (byte) i;
>                 }
>             }
>         }
> 
>         //convert byte array to string
>         String replyStr;
>         try {
>             replyStr = new String(reply, 0, replyLen, "ASCII7");
>         } catch (UnsupportedEncodingException ignored) {
>             replyStr = new String(reply, 0, replyLen);
>         }
>    System.out.println("Reply String : " + replyStr);
> 
>         //we check for connection established because our proxy returns 
> http/1.1 instead of 1.0
>         if (replyStr.toLowerCase().indexOf("200 connection established") == 
> -1) {
>             System.err.println(replyStr);
>             throw new IOException("Unable to tunnel through " + tunnelHost + 
> ":" + tunnelPort + ". Proxy returns\"" + replyStr + "\"");
>         }
>         //tunneling hanshake was successful
>     }
> 
> }

> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to