SimpleHTTPSClient.java

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 {
  // Définition de constantes par défaut
  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);
    }
    // Récupération des constantes à partir des préférences utilisateur
    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();
    // Création de l'URI 
    URI uri = new URI(args[0]);
    if (!uri.getScheme().equals("https")) {
      System.err.print("Usage: java " +
               SimpleHTTPSClient.class.getName() +
               " <https://...>");
      System.exit(1);
    }
    // Récupération du gestionnaire de clefs
    KeyManager[] kms = null;
    if(keyStore != null) {
      kms = SSLHelper.getKeyManagers(keyStore, keySecret, keyPassword);
    }
    // Récupération du gestionnaire de certificats de confiance standard
    TrustManager[] tms=SSLHelper.getTrustManagers(trustStore,trustSecret);
    // Encapsulation du gestionnaire de certificats de confiance
    // pour permettre une interaction avec l'utilisateur
    tms[0] = new X509TrustManagerWrapper(localStore,
                     localSecret,
                     (X509TrustManager) tms[0],
                     new TextCallbackHandler());
    SSLContext context = SSLHelper.getSSLContext(kms, tms);
    // Récupération de la fabrique de socket
    SSLSocketFactory ssf = context.getSocketFactory();
    // Récupération du nom du serveur et du port de connexion
    int port = uri.getPort();
    if (port == -1) {
      port = HTTPS_PORT;
    }
    String server = uri.getHost();
    // Connexion de la  socket
    SSLSocket socket = (SSLSocket) ssf.createSocket(server, port);
    // Démarrage du handshake
    socket.startHandshake();
    // Récupération du flot de sortie vers la socket
    PrintWriter out =
      new PrintWriter(new OutputStreamWriter(socket.getOutputStream(),
                         "ASCII"));
    // Émission de la requête HTTP
    out.print("GET ");
    out.print(uri.getPath());
    out.print(" HTTP/1.0\r\n\r\n");
    out.flush();
    // Récupération et affichage de la réponse du serveur
    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);
    }
  }
}