3

我可以将 SSLServerSocket 类用于 http 和 https 会话并侦听一个端口(通过自动检测客户端带有 http 或 https)吗?还是必须打开两个端口并使用 SSLServerSocket for https 和 ServerSocket for http?

谢谢

4

1 回答 1

4

您正在尝试做的事情称为端口统一。例如,它在 Grizzly中实现。

您不能真正使用 anSSLServerSocket直接监听 HTTP 和 HTTPS 流量,因为它会在读取时直接开始握手,但是您可以使用 plain ServerSocket,接受 plain Socket,尝试检测何时获得 TLS 客户端 hello 或HTTP 请求通过读取前几个字节,然后将其转换为SSLSocket.

我不能说我已经尝试过Sockets,但是您需要一些东西来提前阅读 TLS Client Hello 并在必要时将其推回,可能使用 a PushBackInputStream,如 EJP 所建议的那样

(据我所知,Grizzly 使用SSLEngine而不是SSLSocket为此。)

请注意,使用端口统一是非常不寻常的。我不确定提前阅读的开销是多少。使用多个端口通常不是问题(此外 HTTP 和 HTTPS 具有不同的默认端口,因此您必须至少在两个 URL 之一中指定端口)。

于 2013-03-15T11:53:36.253 回答