不支持或无法识别的 SSL 消息,无法读取

发布于 2025-01-16 04:27:05 字数 3535 浏览 4 评论 0原文

我正在尝试通过 SSL 服务器在 HTTPS 网站上显示日期。

我在第 31 行收到一个错误(我已经标记了它的位置)。

我认为这可能与浏览器及其设置方式有关。由于错误来自不受支持的消息。

代码:

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 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)

我正在使用 firefox 和 chrome 进行测试。 谢谢 :)

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 :)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文