首页 > 解决方案 > 在 Java 中拒绝 HTTP 服务器上的 SSL 连接

问题描述

大家下午好,

我的 HTTP 服务器有一些问题。我已经制作了自己的 HTTP 服务器(由于某些情况和需要而成为轻量级 HTTP 服务器),我想在我拥有的软件上实现它。此 HTTP API 也用于允许 HTTPS,但我的主要问题实际上来自 HTTP。

我面临的一个问题是在 HTTP 服务器上检索 HTTPS 连接。使用 HTTPS 作为服务器,使用 HTTP 作为来自客户端的连接被拒绝,因为握手失败并给服务器一个异常。将 HTTP 服务器与 HTTPS 客户端一起使用的问题是此连接一直在运行,但消息已加密。由于它是加密的,我无法读取信息并获取诸如 Content-Length 之类的详细信息,因此服务器正在等待一个永远不会到来的结束,因为它无法正确读取数据。

我想知道 Java 中是否有一种方法可以检测客户端是否使用加密响应来拒绝此连接,而不是尝试读取它们。此套接字的主要问题是它们未被检测为 SSLSocket,它们是无法解密 InputStream 中的信息的普通套接字。

先感谢您。

标签: javahttpsserver

解决方案


您是否知道 HTTP 和 HTTPS 通常在不同的端口号上提供服务?所以 80 用于 HTTP,443 用于 HTTPS。对于非特权端口,通常使用 8000 和 8443。在仅 HTTP 端口上使用 TLS 连接的客户端出现故障,您的 HTTP 服务器应该可以轻松检测到非 HTTP 流量:

如果收到的第一个单词不是您的服务器支持的 HTTP 动词之一,例如 GET、HEAD、POST、PUT、OPTIONS 等。您的服务器应该发送 400 或 408 响应(408 是请求超时,您的服务器应该只等待请求标头的合理时间)然后关闭连接。


推荐阅读