当前位置: 首页 > 知识库问答 >
问题:

Netty SSL模式奇怪的行为

壤驷英叡
2023-03-14

我试图理解,为什么Netty SSL模式工作在奇怪的方式?此外,问题如下,当任何SSL客户端(https浏览器,使用ssl的java客户端,也任何ssl客户端应用程序)连接到Netty服务器时,我开始完整的消息,在那里我可以正确识别所使用的协议,但只要通道保持连接,任何下面的消息都有奇怪的结构,与非ssl模式不同。例如,当https浏览器连接到我的服务器时,MessageRec的方法:

我已使用PortUnificationServerHandler切换协议。。(没有使用nettys http处理程序,这只是一个示例,因为我也使用ssl模式来实现自己的协议)

  1. 第一条消息没有问题,我得到了以get或POST开头的完整标题

在这里,使用哪个子协议并不重要,http或其他,在第一条消息之后,我首先得到一个字节,在第二条消息上得到请求的其余部分。。

我想构建一些代理的艺术,获取ssl数据并在其他侦听器上以未编码的方式发送它,但是当我在不等待完整数据请求的情况下直接这样做时,目标侦听器(例如http服务器)无法处理此类数据,如果目标仅获取一个字节作为第一个字节(即使下一条消息包含其余的字节),通道立即关闭,请求被放弃。。好的,首先要做的是,暂时缓存第一个字节,等待下一条消息,然后加入这些消息,只有响应,这很好,但有时这不是正确的方法,因为一个字节有时实际上是最后一个消息字节,如果我缓存它,错误地等待下一条消息,我可以永远等待,因为https浏览器此时需要一些响应,不再发送任何数据。。

现在的问题是,是否有可能用SSL解决这个问题?可能有特殊的设置对这种行为有影响吗?我想一次完全加入消息,因为是,而不是第一个字节,比其余的。.你能确认,与较新的Netty版本,你有相同的行为通过使用PortUnificationServerHandler(但没有netty超文本传输协议处理程序,尝试一些自己的处理程序。)这是行为好吧,所以,我不相信,它被投射所以工作。.

共有2个答案

邬弘化
2023-03-14

我遇到过这个问题,发现它是由使用JDK1.7引起的。回到JDK1.6解决了这个问题。我没有时间进一步研究,但现在假设SSLEngine实现在JDK中已经改变。如果时间允许,我会进一步调查。

左丘昕
2023-03-14

您所经历的可能是由于针对野兽攻击的对策。

这不是问题。问题似乎在于,您假设您要以消息/数据包的形式读取数据。事实并非如此:TCP(和TLS/SSL)被用作连续数据流。当数据可用时,您应该继续读取数据。应用程序协议将指导在何处分割有意义的传入数据。对于HTTP,指示是标题后面的空行和<代码>内容长度<代码>或实体的块传输编码。

如果您定义自己的协议,那么无论您使用普通HTTP还是SSL/TLS,都需要类似的机制。假设你不需要它,这只是偶然的。

 类似资料:
  • 我有以下代码来解析一个JSON文件: 要处理以下JSON文件: 如果我执行此代码,我将收到以下错误: 所以我开始一步一步地调试应用程序,看看part processing()中的哪个代码部分抛出了这个异常。令人惊讶的是,那里的所有代码都正常执行:没有抛出异常,也没有返回结果I except。 更让我惊讶的是,当我稍微改变第一种方法的代码时,它可以在不产生异常的情况下工作。 我不知道println方

  • 问题内容: 我在GregorianCalendar类中遇到一个奇怪的行为,我想知道我是否真的做得不好。 仅当初始化日期的月份的实际Maximum大于我将日历设置为的月份时,才追加此值。 这是示例代码: 我知道问题是由于日历初始化日期是31天(可能是5月),与设置为2月(28天)的月份混淆了。修复很容易(只需在设置年和月之前将day_of_month设置为1),但是我想知道这确实是想要的行为。有什么

  • 问题内容: 我正在为一个问题而苦苦挣扎,我不明白为什么它不起作用。如何通过将变量传递并转换为? 为什么在顶部代码段中不起作用,但在行下方的底部代码段中起作用? 唯一的区别似乎是添加了一个额外的变量,该变量也被键入为? 问题答案: 该是一种原始类型,同时是一个普通的Java类。您不能在原始类型上调用方法。但是该方法在上可用,如javadoc中所示 有关这些原始类型的更多信息,请参见此处

  • 问题内容: 为什么的到哪里去了? 问题答案: 删除任何字符,并从字符串的开头和结尾。

  • 问题内容: 我认为这是一个正常程序,但这是我得到的输出: 有人可以向我解释一下吗? 问题答案: 这是有据可查的PHP行为,请参阅php.net的foreach页面上的警告。 警告 即使在 foreach 循环之后,仍保留 $ value的 引用和最后一个数组元素。建议通过unset()销毁它。 __ 编辑 尝试逐步了解此处实际发生的情况

  • 问题内容: 我有上面的代码,但我不知道为什么会产生 而不是 非常感谢 问题答案: 使用量词来匹配1个或多个空格,而不是:- 表示匹配0个或多个空格,并且将在每个字符之前匹配一个空字符,并由一个空格代替。