May I also suggest that:
-you never post to multiple newsgroup
-show that at least you tried to do something before sending your post
What you are trying to do (assuming you are) is what I call "a man in
the middle". I have written one: it is very simple in Java with HTTP,
much, much more complicated with HTTPS and close to a nightmare when
there is a proxy.
First read the API documentations SSLSocketFactory, SSLSocket,
SSLServerSocket, SSLServerSocketFactory, SSLContext, X509TrustManager,
KeyManagerFactory, and Google around these ones - there is plenty of
code out there to show basic use of them.
Once you have code to show, come back to this forum.
Of course i have do many research and reading on API before.
I just dont know how to let my program handshake with the browser.
I post the code at the bottom part....
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.i

utputStream;
import java.i

utputStreamWriter;
import java.io.Writer;
import java.net.ServerSocket;
import java.net.Socket;
import java.security.KeyStore;
import java.security.cert.Certificate;
import javax.net.ssl.HandshakeCompletedEvent;
import javax.net.ssl.HandshakeCompletedListener;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLPeerUnverifiedException;
import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.SSLServerSocketFactory;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;
public class Test {
public static final String TARGET_HTTPS_SERVER =
"
www.ebank.hsbc.com.hk";
public static final int TARGET_HTTPS_PORT = 443;
static final String[] enabledCipherSuites =
{"SSL_RSA_WITH_RC4_128_MD5",
"SSL_RSA_WITH_RC4_128_SHA", "TLS_RSA_WITH_AES_128_CBC_SHA",
"TLS_DHE_RSA_WITH_AES_128_CBC_SHA",
"TLS_DHE_DSS_WITH_AES_128_CBC_SHA",
"SSL_RSA_WITH_3DES_EDE_CBC_SHA",
"SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA",
"SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA", "SSL_RSA_WITH_DES_CBC_SHA",
"SSL_DHE_RSA_WITH_DES_CBC_SHA", "SSL_DHE_DSS_WITH_DES_CBC_SHA",
"SSL_RSA_EXPORT_WITH_RC4_40_MD5",
"SSL_RSA_EXPORT_WITH_DES40_CBC_SHA",
"SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA",
"SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA",
"SSL_RSA_WITH_NULL_MD5", "SSL_RSA_WITH_NULL_SHA",
"SSL_DH_anon_WITH_RC4_128_MD5", "TLS_DH_anon_WITH_AES_128_CBC_SHA",
"SSL_DH_anon_WITH_3DES_EDE_CBC_SHA", "SSL_DH_anon_WITH_DES_CBC_SHA",
"SSL_DH_anon_EXPORT_WITH_RC4_40_MD5",
"SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA"};
public static void main(String[] args) throws Exception {
SSLContext ctx;
KeyManagerFactory kmf;
KeyStore ks;
char[] passphrase = "WebAS".toCharArray();
ctx = SSLContext.getInstance("SSL");
kmf = KeyManagerFactory.getInstance("SunX509");
ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream("c:\\DummyServerTrustFile.jks"),
passphrase);
kmf.init(ks, passphrase);
TrustManagerFactory tmf =
TrustManagerFactory.getInstance("SunX509");
tmf.init(ks);
ctx.init(kmf.getKeyManagers(),
tmf.getTrustManagers(),
new java.security.SecureRandom());
SSLSocketFactory sslsocketfactory = ctx.getSocketFactory();
// SSLSocketFactory sslsocketfactory = (SSLSocketFactory)
SSLSocketFactory.getDefault();
SSLServerSocketFactory sSLServerSocketFactory
= ctx.getServerSocketFactory();
ServerSocket serverSocket = new ServerSocket(8080);
int dataLength;
byte[] buf = new byte[1024];
String header = "";
ByteArrayOutputStream byteArrayOutputStream = new
ByteArrayOutputStream();
int count = 0;
while (true) {
System.out.print("waiting.....");
Socket soc = serverSocket.accept();
System.out.println("socket created!!");
InputStream inputStream = soc.getInputStream();
count++;
//boolean connect = true;
boolean connect = false;
char code = '0';
BufferedReader br = new BufferedReader(
new InputStreamReader(soc.getInputStream()));
String lin = null;
int i = 0;
while (true) {
//for (int i=0; i<3; i++) {
lin = br.readLine();
if (i==0) {
if (lin.charAt(lin.length()-1) == '1')
code = '1';
if (lin.startsWith("CONNECT"))
connect = true;
}
for (int k = 0; k<lin.length(); k++) {
// System.out.print((int) lin.charAt(k)+" ");
}
System.out.println(lin);
if ((lin.equals("\r")) || (lin.length() == 0))
break;
i++;
}
Writer ou = new OutputStreamWriter(
soc.getOutputStream());
if (connect){
// System.out.println("back!!!!HTTP/1."+code+" 200 connection
established\r\n\r\n");
code = '0';
ou.write("HTTP/1."+code+" 200 Connection established\r\n");
ou.write("Via: Proxy Name and Version\r\n");
ou.write("\r\n");
ou.flush();
//lin = "";
// while ((dataLength = inputStream.read(buf)) != -1) {
dataLength = inputStream.read(buf);
byteArrayOutputStream.write(buf, 0, dataLength);
header = new String(byteArrayOutputStream.toByteArray(),
"ISO-8859-1");
System.out.println(header);
for (int a=0; a<header.length(); a++)
System.out.print((int) header.charAt(a)+" ");
// }
SSLSocket sSocket =
(SSLSocket)sslsocketfactory.createSocket("
www.XXX.com", 443);
/* sSocket.setUseClientMode(true);
InputStream in2 = sSocket.getInputStream();
OutputStream ot2 = sSocket.getOutputStream();
// ot2.write(byteArrayOutputStream.toByteArray());
// ot2.flush();
sSocket.addHandshakeCompletedListener(
new HandshakeCompletedListener() {
public void handshakeCompleted(HandshakeCompletedEvent event) {
System.out.println("Handshake finished!");
System.out.println("\tCipherSuite:" + event.getCipherSuite());
System.out.println("\tSessionId "
+ event.getSession());
try{
Certificate[] c = event.getSession().getPeerCertificates();
for (int b = 0; b<c.length; b++){
System.out.println("****["+b+"]****");
System.out.println(c
.toString());
}
}
catch (SSLPeerUnverifiedException spue) {
}
System.out.println("\t PeerHost " +
event.getSession().getPeerHost ());
}
}
);try {
sSocket.startHandshake();
}
catch (Exception e) {
e.printStackTrace();
}
byteArrayOutputStream = new ByteArrayOutputStream();
dataLength = in2.read(buf);
byteArrayOutputStream.write(buf, 0, dataLength);
header = new String(byteArrayOutputStream.toByteArray());
System.out.println(header);
for (int a=0; a<header.length(); a++){
System.out.print((int) header.charAt(a));
System.out.print(header.charAt(a));
System.out.print(" ");
}*/
//open URLconnection
//SSLSocket sSocket = (SSLSocket)
sslsocketfactory.createSocket(soc, "www.ebank.hsbc.com.hk", 443,
true);
//SSLServerSocket sSocket = (SSLServerSocket)
sSLServerSocketFactory.createServerSocket(8080);
//sSocket.setUseClientMode(true);
//sSocket.setUseClientMode(false);
//sSocket.setNeedClientAuth(true);
//sSocket.setEnabledCipherSuites(enabledCipherSuites);
sSocket.addHandshakeCompletedListener(
new HandshakeCompletedListener() {
public void handshakeCompleted(HandshakeCompletedEvent event) {
System.out.println("Handshake finished!");
System.out.println("\tCipherSuite:" + event.getCipherSuite());
System.out.println("\tSessionId "
+ event.getSession());
try{
Certificate[] c = event.getSession().getPeerCertificates();
for (int b = 0; b<c.length; b++){
System.out.println("****["+b+"]****");
System.out.println(c.toString());
}
}
catch (SSLPeerUnverifiedException spue) {
}
System.out.println("\t PeerHost " +
event.getSession().getPeerHost ());
}
}
);
System.out.print("changing.....");
try {
sSocket.startHandshake();
}
catch (Exception e) {
e.printStackTrace();
}
System.out.println("done!!!");
Writer ou2 = new OutputStreamWriter(
sSocket.getOutputStream(), "ISO-8859-1");
ou2.write("2134567890");
ou2.flush();
} else {
//SSLSocketFactory sslsocketfactory = (SSLSocketFactory)
SSLSocketFactory.getDefault();
Socket socket = SSLSocketFactory.getDefault().createSocket(TARGET_HTTPS_SERVER,
TARGET_HTTPS_PORT);
//Socket socket = new Socket(TARGET_HTTPS_SERVER,
TARGET_HTTPS_PORT);
try {
System.out.println("here");
Writer out = new OutputStreamWriter(
socket.getOutputStream(), "ISO-8859-1");
out.write("GET / HTTP/1.0\r\n");
out.write("Host: " + TARGET_HTTPS_SERVER + ":" +
TARGET_HTTPS_PORT + "\r\n");
out.write("Agent: SSL-TEST\r\n");
out.write("\r\n");
out.flush();
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream(), "ASCII7"));
String line = null;
while ((line = in.readLine()) != null) {
System.out.println(line);
ou.write(line+"\r\n");
}
ou.flush();
} finally {
socket.close();
}
}
}
}
}
What i want to do is making a handshake process with the browser
I can use plaintext communicate with the destinated host
however, the mean important part is make trust with browser which i
was confused to to so, ie let the browser believe me i am the server.