From 52ed4181f9360b1f9f6aa38b8547b44066ca8db6 Mon Sep 17 00:00:00 2001 From: Dirk Wetter Date: Wed, 4 May 2022 15:39:32 +0200 Subject: [PATCH] Add SSLSocketClient in Java Note this doesn't add alpn (same as openssl). See here https://docs.oracle.com/javase/8/docs/api/javax/net/ssl/SSLSocket.html if you want to add that. This code is NOT GPLv2! It was taken from the Oracle web site which didn't list any license (https://docs.oracle.com/javase/10/security/sample-code-illustrating-secure-socket-connection-client-and-server.htm). --- etc/SSLSocketClient.java | 87 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 etc/SSLSocketClient.java diff --git a/etc/SSLSocketClient.java b/etc/SSLSocketClient.java new file mode 100644 index 0000000..de2e1e4 --- /dev/null +++ b/etc/SSLSocketClient.java @@ -0,0 +1,87 @@ +import java.net.*; +import java.io.*; +import javax.net.ssl.*; + +/* java SSLSocketClient + * https://docs.oracle.com/javase/10/security/sample-code-illustrating-secure-socket-connection-client-and-server.htm + */ + +/* + * This example demostrates how to use a SSLSocket as client to + * send a HTTP request and get response from an HTTPS server. + * It assumes that the client is not behind a firewall + */ + +public class SSLSocketClient { + + public static void main(String[] args) throws Exception { + String host=args[0]; + + if ( args == null || args.length == 0 || host.trim().isEmpty() ) { + System.out.println("You need to supply a valid hostname"); + } else { + try { + SSLSocketFactory factory = + (SSLSocketFactory)SSLSocketFactory.getDefault(); + SSLSocket socket = + (SSLSocket)factory.createSocket(host, 443); + + /* + * send http request + * + * Before any application data is sent or received, the + * SSL socket will do SSL handshaking first to set up + * the security attributes. + * + * SSL handshaking can be initiated by either flushing data + * down the pipe, or by starting the handshaking by hand. + * + * Handshaking is started manually in this example because + * PrintWriter catches all IOExceptions (including + * SSLExceptions), sets an internal error flag, and then + * returns without rethrowing the exception. + * + * Unfortunately, this means any error messages are lost, + * which caused lots of confusion for others using this + * code. The only way to tell there was an error is to call + * PrintWriter.checkError(). + */ + socket.startHandshake(); + + PrintWriter out = new PrintWriter( + new BufferedWriter( + new OutputStreamWriter( + socket.getOutputStream()))); + + out.println("GET / HTTP/1.1"); + out.println("Host: " + host); + out.println("Connection: close"); + out.println(); + out.flush(); + + /* + * Make sure there were no surprises + */ + if (out.checkError()) + System.out.println( + "SSLSocketClient: java.io.PrintWriter error"); + + /* read response */ + BufferedReader in = new BufferedReader( + new InputStreamReader( + socket.getInputStream())); + + String inputLine; + while ((inputLine = in.readLine()) != null) + System.out.println(inputLine); + + in.close(); + out.close(); + socket.close(); + + } catch (Exception e) { + e.printStackTrace(); + } + } + } +}