import java.io.*; import java.net.*; import javax.net.ssl.*; import java.security.KeyStore; import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLContext; import java.security.cert.Certificate; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.TrustManagerFactory; import java.security.GeneralSecurityException; /*com.sun.net.ssl.* is in JDK 1.4 and is deprecated*/ /* * @author Gaurav Pandey * @contact gaurav@caa.columbia.edu */ public class HelloClient { /* * java HelloClient * */ /* * example: $java client localhost 8443 CliKeystore abcd123 abcd123 */ public static void main(String[] args) { BufferedReader br = null; SSLSocket socket = null; try { if (args.length != 5) { System.out.println("Invalid number of params\n "); } else { String url = args[0], port = args[1], ks_file = args[2]; String ks_pass = args[3], keypass = args[4]; InetAddress server_addr = InetAddress.getByName(url); System.out.println("Reading from Keystore..."); KeyStore keystore = KeyStore.getInstance("JKS"); keystore.load(new FileInputStream(ks_file), ks_pass.toCharArray()); System.out .println("Loading Certificate data into KeyManagerFactory by using the password..."); KeyManagerFactory kmf = KeyManagerFactory .getInstance("SunX509"); kmf.init(keystore, keypass.toCharArray()); System.out .println("Initialize the Trustmanager Obj with the Keystore..."); TrustManagerFactory tmf = TrustManagerFactory .getInstance("SunX509"); tmf.init(keystore); System.out.println("Initializing Socket..."); SSLContext sslc = SSLContext.getInstance("TLS"); sslc.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); socket = (SSLSocket) sslc.getSocketFactory().createSocket( server_addr, Integer.parseInt(port)); System.out.println("Enabling all available cipher suites..."); String[] suites = socket.getSupportedCipherSuites(); socket.setEnabledCipherSuites(suites); System.out.println("Registering the handshake listener..."); socket.addHandshakeCompletedListener(new MyHandshakeListener()); System.out.println("Starting handshake procedure..."); socket.startHandshake(); System.out.println("Printing Server Certificate info..."); Certificate[] cert = socket.getSession().getPeerCertificates(); for (int i = 0; i < cert.length; i++) System.out.println(cert[i]); System.out.println("Just connected to " + socket.getRemoteSocketAddress()); /* * Please pass some dummy data/msg from Server side to welcome * connected Clients */ try { br = new BufferedReader(new InputStreamReader( socket.getInputStream())); String s = null; while ((s = br.readLine()) != null) System.out.println(s); } catch (IOException ioe) { System.out.println("\nIOException encountered: " + ioe.getMessage()); } } } catch (IOException ioe) { System.out.println("Error connecting to server: " + ioe.getLocalizedMessage()); } catch (GeneralSecurityException gse) { System.out.println("An error occurred while setting up TLS:" + gse.getMessage()); } catch (Exception e) { e.printStackTrace(); } } } class MyHandshakeListener implements HandshakeCompletedListener { public void handshakeCompleted(HandshakeCompletedEvent e) { System.out.println("Handshake succesful!"); System.out.println("Using cipher suite: " + e.getCipherSuite()); } }