0

I am trying to display the date on an HTTPS website via an SSL server.

I am getting an error thrown on line 31 (I have marked where it is).

I reckon it might be to do with the browser and how it is set up. Since the error is coming from an unsupported message.

Code:

import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.SSLServerSocketFactory;
import javax.net.ssl.SSLSocket;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.util.Date;

public class SSLServer {
    final static String pathToStores = "keys";
    final static String keyStoreFile = "server-key.pem";
    final static String password = "";

    final static int port = 8080;

    static boolean debug = false;


    void doServerSide() throws Exception {
        SSLServerSocketFactory sslServerSocketFactory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
        SSLServerSocket sslServerSocket = (SSLServerSocket) sslServerSocketFactory.createServerSocket(port);

        SSLSocket sslSocket = (SSLSocket) sslServerSocket.accept();

        InputStream inputStream = sslSocket.getInputStream();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));

        String line = "";


///////////////////// exception thrown on the line below /////////////////////

        while ((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }

        OutputStream outputStream = sslSocket.getOutputStream();

        String httpResponce = "HTTP/1.1 200 OK\r\n\r\n" + new Date();
        outputStream.write(httpResponce.getBytes(StandardCharsets.UTF_8));

        sslSocket.close();
    }

    public static void main(String[] args) throws Exception {
        String trustFilename = pathToStores + "/" + keyStoreFile;

        System.setProperty("java.net.ssl.keyStore", trustFilename);
        System.setProperty("javax.net.ssl.keyStorePassword", password);

        if (debug) System.getProperty("java.net.debug", "all");

        new SSLServer().doServerSide();
    }
}

Exception:

Exception in thread "main" javax.net.ssl.SSLException: Unsupported or unrecognized SSL message
    at java.base/sun.security.ssl.SSLSocketInputRecord.handleUnknownRecord(SSLSocketInputRecord.java:451)
    at java.base/sun.security.ssl.SSLSocketInputRecord.decode(SSLSocketInputRecord.java:175)
    at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:110)
    at java.base/sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1497)
    at java.base/sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1403)
    at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:441)
    at java.base/sun.security.ssl.SSLSocketImpl.ensureNegotiated(SSLSocketImpl.java:903)
    at java.base/sun.security.ssl.SSLSocketImpl$AppInputStream.read(SSLSocketImpl.java:994)
    at java.base/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:297)
    at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
    at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:188)
    at java.base/java.io.InputStreamReader.read(InputStreamReader.java:178)
    at java.base/java.io.BufferedReader.fill(BufferedReader.java:161)
    at java.base/java.io.BufferedReader.readLine(BufferedReader.java:329)
    at java.base/java.io.BufferedReader.readLine(BufferedReader.java:396)
    at SSLServer.doServerSide(SSLServer.java:31)
    at SSLServer.main(SSLServer.java:51)

I am using firefox and chrome for testing. Thanks :)

Ben
  • 9
  • 1
  • 3
  • Your home-grown HTTP server is not correct, in several ways. Use a real one, such as a servlet. It's a non-trivial protocol. – user207421 Mar 22 '22 at 23:43

0 Answers0