package fr.umlv.ji.tcp.client.https;
import java.io.*;
import java.net.*;
import java.util.prefs.Preferences;
import javax.net.ssl.*;
import java.security.GeneralSecurityException;
import fr.umlv.ji.ssl.*;
import com.sun.security.auth.callback.TextCallbackHandler;
public class SimpleHTTPSClient {
public final static int HTTPS_PORT = 443;
public final static int BUFFER_SIZE = 1024;
public static void main(String[] args)
throws URISyntaxException, IOException, GeneralSecurityException {
if(args.length != 1) {
System.err.print("Usage: java " +
SimpleHTTPSClient.class.getName()
+ " <https://...>");
System.exit(1);
}
Preferences prefs = Preferences
.userNodeForPackage(SimpleHTTPSClient.class);
String keyStore = prefs.get("keyStore", null);
char[] keySecret =
prefs.get("keySecret", "keySecret").toCharArray();
char[] keyPassword =
prefs.get("keyPassword", "keyPassword").toCharArray();
String trustStore = prefs.get("trustStore","trustStore");
char[] trustSecret =
prefs.get("trustSecret", "trustSecret").toCharArray();
String localStore = prefs.get("localStore","localStore");
char[] localSecret =
prefs.get("localSecret", "localSecret").toCharArray();
URI uri = new URI(args[0]);
if (!uri.getScheme().equals("https")) {
System.err.print("Usage: java " +
SimpleHTTPSClient.class.getName() +
" <https://...>");
System.exit(1);
}
KeyManager[] kms = null;
if(keyStore != null) {
kms = SSLHelper.getKeyManagers(keyStore, keySecret, keyPassword);
}
TrustManager[] tms=SSLHelper.getTrustManagers(trustStore,trustSecret);
tms[0] = new X509TrustManagerWrapper(localStore,
localSecret,
(X509TrustManager) tms[0],
new TextCallbackHandler());
SSLContext context = SSLHelper.getSSLContext(kms, tms);
SSLSocketFactory ssf = context.getSocketFactory();
int port = uri.getPort();
if (port == -1) {
port = HTTPS_PORT;
}
String server = uri.getHost();
SSLSocket socket = (SSLSocket) ssf.createSocket(server, port);
socket.startHandshake();
PrintWriter out =
new PrintWriter(new OutputStreamWriter(socket.getOutputStream(),
"ASCII"));
out.print("GET ");
out.print(uri.getPath());
out.print(" HTTP/1.0\r\n\r\n");
out.flush();
InputStream in = new BufferedInputStream(socket.getInputStream());
byte[] buffer = new byte[BUFFER_SIZE];
int nb;
while((nb=in.read(buffer))!= -1) {
System.out.write(buffer,0,nb);
}
}
}